Android Manifest之<provider>元素中文註釋

語法
    <provider android:authorities="list"

          android:enabled=["true" |"false"]

          android:exported=["true" |"false"]

          android:grantUriPermissions=["true" | "false"]

          android:icon="drawable resource"

          android:initOrder="integer"

          android:label="string resource"

          android:multiprocess=["true" | "false"]

          android:name="string"

          android:permission="string"

          android:process="string"

          android:readPermission="string"

          android:syncable=["true" |"false"]

          android:writePermission="string" >

        .. .

    </provider>

父元素
    <application>

子元素
    <meta-data>

    <grant-uri-permission>

    <path-permission>

描述
    聲明content provider組件。Content provider是ContentProvider的子類,這個ContentProvider提供瞭對由應用管理的數據的結構化訪問。在應用中的所有content provider都必須在manifest文件中通過<provider>元素進行聲明;否則系統就不知道它也不會運行它。

    你隻能定義content provider作為一個你應用的一部分。在你的應用中使用的其它應用的content provider不應被定義。

    Android系統根據authority串儲存一個到content provider的引用,也就是provider的content URI部分。例如,加入你想通過content provider訪問關於健康保健專業的信息。為瞭做這件事,你就需要調用方法ContentResolver.query(),在這個方法中,除瞭其它參數之外,還要傳遞標識瞭這個提供者的URI:

    content://com.example.project.healthcareprovider/nurses/rn

    這個content: scheme表示這個URI將作為內容URI指向Android content provider。而authoritycom.example.project.healthcareprovider則指明瞭這個provider自身;那麼Android系統就在它們已知的providers和authorities列表中進行查找這個authority。子串nurses/rn是path,content provider就用它來標識這個提供者數據的子集。

    註意,當你在<provider>元素中定義你的provider時,在android:name的參數中你不用包含這個scheme或path,而隻需要authority。

    更多關於使用content provider的信息,參見API向導,Content Providers。

屬性
android:authorities

    一個或多個URI authorities,這些authorities表示瞭由content provider提供的數據。多個authroities用它們的名字以分號(;)隔開。為瞭避免沖突,authority名稱應當使用java風格的命名規范(例如,“com.example.provider.cartoonprovider”)。最典型的做法就是,它是實現這個provider的ContentProvider子類的名稱。

    這個屬性沒有默認值,至少必須指定一個authority。

android:enabled

    是否這個content provider能由系統初始化-如果能則為true,否則為false。默認為true。

    <application>元素有它自身的應用到所有組件的enabled屬性,包括content provider。要讓這個content provider啟用,<application>和<provider>的enabled屬性都必須為true。如果有一個為false,這個provider就被disabled;那麼它就不能實例化。

android:exported

    是否這個content provider對其它應用是可以使用的:

    ·true:這個provider對其它應用可用。任何應用都能使用這個provider的content URI和受這個provider指定的permission來訪問它。

    ·false:這個provider對其它應用不可用。設置android:exported=false將限制到你應用的provider的訪問。作為provider來說,隻有同一個用戶ID(UID)的應用才能訪問它。

    對將android:minSdkVersion或android:targetSdkVersion設置為16或以下的應用這個默認值為true。對於將這些屬性設置為17或更高的應用這個默認值為false。

    你能通過android:exported=false和用permission設置屬性來限制訪問你應用的provider。

android:grantUriPermissions

    是否哪些原來沒有權限訪問content provider數據的組件能授權使用這個provider,臨時性的使用readPermission、writePermission和permission屬性來忽略這個限制-如果權限能授予則為true,否則為false。如果為true,那麼權限能被授予任何content provider的數據。如果為false,如果有的話,那麼權限隻能被授予在<grant-uri-permission>子元素中列出的數據子集。默認是false。

    授權是指給應用組件一次訪問由權限保護的數據的方式。例如,當電子郵件包含附件,即使這個視圖沒有查看所有content providers屬性的一般權限,這個電子郵件應用也可以調用對應的視圖打開它。

    在這種情況下,權限由啟動組件的intent 對象中的FLAG_GRANT_READ_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSION標記來授權。例如,電郵應用可以將FLAG_GRANT_READ_URI_PERMISSION放入intent對象中傳遞給Context.startActivity。在這個intent中這個對這個URI的權限就被指定。

    如果你通過將這個屬性設置為true或定義<grant-uri-permission>子元素開啟瞭這個功能,那麼當URI從provider刪除時,你必須調用Context.revokeUriPermission()。

android:icon

    這個content provider呈現的圖標。這個屬性必須設置為包含圖片的drawable資源的引用。如果沒有設置,由application指定的圖標就會代替它(參見<application>元素的icon屬性)。

android:initOrder

    相對於同一個進程中的其它content provider來說,這個 content provider初始化的順序。當在content providers之間有依賴關系時,為它們當中的每一個設置這個屬性可以確保它們按照那些依賴需要的順序被創建。這個值是整數,數字越大越優先。

android:label

    用戶可讀的content provider的標簽。如果這個屬性沒有設置,那麼這個application的標簽就會代替它(參見<application>元素的label屬性)。

    這個標簽應該設置為string資源的引用,以便它能像其它string資源一樣在用戶接口中本地化。然而,為瞭方便起見,當你開發應用時,它也能設置為raw串。

android:multiprocess

    是否這個content provider的實例能在每個客戶端中被創建-如果這個實例能在多個進程中創建則為true,否則為false,默認為false。

    一般來說,content provider隻能在定義它的應用中初始化。然而,如果這個標記設為true,那麼系統就能在每個客戶端需要和它交互的進程中創建一個實例,因此,需要盡力避免進程之間通信開銷。

android:name

    實現這個content provider類的名稱,也就是ContentProvider的子類。這應該是完整的類名(如,“com.example.project.TransportationProvider”)。然而,作為一種簡寫的方式,如果這個名稱的第一個字母是(如“.TransportationProvider”),那麼它就會自動追加到manifest中定義的包名的後面。

    這個屬性沒有默認值,必須指定。

android:permission

    客戶端讀寫content provider數據所需的權限的名稱。這個屬性單獨設置讀和寫來說是一種方便的方式。然而,readPermission和writePermission屬性優先於這個屬性。如果readPermission屬性也設置,那麼它就控制對content provider的查詢。如果writePermission屬性也設置,那麼它就控制對content provider的修改。

android:process

    這個content provider運行的進程的名稱。一般來說,所有組件都應當運行由它所在應用創建的默認進程中。和應用的包名一樣。<application>元素的process屬性可以對所有應用組件設置不同的默認值。然而每個組件自身可以通過process屬性重寫這個默認值,進而允許你的應用跨進程通信。

    如果這個分配的名稱以冒號(:)開始,那麼當它需要運行在哪個進程的時候,一個新的,私有的進程就被創建。如果這個進程名稱以小寫字母開始,那麼這個provider將運行在全局進程中。這就允許這個進程在不同的應用中共享,進而降低對資源的消耗。

android:readPermission

    客戶端讀取content provider數據所需的權限。

android:syncable

    是否content provider控制的屬於要和服務數據進行同步,若同步則為true,否則為false。

android:writePermission

    客戶端修改由content provider控制的數據時所需的權限。

 

You May Also Like