在Manifest中註冊ContentProvider的寫法和含義

最近在做項目時候,使用到了ContentProvider來共享數據,使用ContentProvider時候,必須在Manifest文件中進行註冊,類似於這樣

<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>

這些屬性分別的含義是什麼呢?
Android系統通過content:URI的授權部分來識別內容提供器。例如,假設下列的URI要傳遞給ContentResolver.query()方法:

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

content:表示數據是屬於內容提供器的,授權(com.example.project.healthcareprovider):標識着一個具體的提供器。因此授權必須唯一的。通常,就像這個例子一樣,授權是一個完整的ContentProvider子類的名稱。URI的路徑部分被內容提供器用來標識具體的數據子集,但是那些路徑沒有被聲明在清單文件中。

屬性(ATTRIBUTES):

android:authorities

標識內容提供器範圍內的數據URI的授權列表,有多個授權時,要用分號來分離每個授權。爲了避免衝突,授權名應該使用Java樣式的命名規則(如:com.example.provider.cartoonprovider)。通常,用ContentProvider子類名稱來設定這個屬性。

這個屬性沒有默認值,至少要指定一個授權。

android:enabled

這個屬性用於指定這個內容提供器是否能夠被系統安裝。設置爲true,則可以安裝;否則不能安裝。默認值是true。

元素有它自己的enabled屬性,這個屬性會應用給所有的應用程序組件,包括內容提供器。和的enabled屬性都必須設置爲true(它們的默認值都是true)。如果有一個設置爲false,那麼提供器就被禁止安裝。

android:exported

這個屬性用於指定該內容提供器是否能夠被其他的應用程序組件使用。如果設置爲true,則可以被使用,否則不能被使用。如果設置爲false,該提供器只對同名的應用程序或有相同用戶ID的應用程序有效。默認值是true。

雖然能夠使用這個屬性來公開內容提供器,但是依然還要用permission屬性來限制對它的訪問。

android:grantUriPermission

這個屬性用於設定那些對內容提供的數據沒有訪問權限的訪問者,是否能夠被授予訪問的權限,這個權限是臨時性的,它會克服由readPermission、writePermission和permission屬性的設置限制。如果這個屬性設置爲true,那麼權限就可以授予訪問者,否則不會授予沒有訪問權限的訪問者。如果設置爲true,則權限可以臨時被授予內容提供器的任何數據。如果設置爲false,則權限只能被授予子元素中所列出的數據子集。默認值是false。

這種授權是應用程序提供了一種一次性訪問被權限所保護的數據的方法。例如,當一個e-mail包含了一個附件時,mail應用程序就可以調用適當的瀏覽器來打開附件,即使這個瀏覽器沒有查看所有內容提供器數據的權限。

在這樣的場景中,權限是通過激活組件的Intent對象中的FLAG_GRANT_READ_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSION標記來授予的。例如,mail應用程序可以把FLAG_GRANT_READ_URI_PERMISSION標記放到傳遞給Context.startActivity()方法的Intent參數中。這樣權限就被授予了Intent對象中所指定的URI。

如果要啓用這個功能,既可以通過把這個屬性設置爲true來完成,也可以通過定義子元素來實現,在切換RUI時,必須調用Context.revokeUriPermission()方法從提供器把權限刪除。

android:icon

這個屬性用於定義一個代表內容提供器的圖標。它必須要引用一個包含圖片定義的可繪製資源。如果這個屬性沒有設置,那麼就會使用應用程序的元素的icon屬性值來代替。

android:initOrder

這個屬性用於定義內容提供器應該被實例化的順序,這個順序是相對與相同進程所擁有的其他內容提供器的。當內容提供器間有相互的依賴時,就需要設置這個屬性,以確保它們能夠按照其依賴的順序被創建。這個屬性值是一個簡單的整數,大的數字要被優先初始化。

Android:label

這個屬性用於給內容提供器定義一個用戶可讀的標籤。如果這個屬性沒有設置,那麼它會使用元素的label屬性值來代替。

這個標籤應該引用一個字符串資源來設置,以便它能夠像其他的用戶界面中的字符串一樣被本地化。但是爲了方便應用程序的開發,也能夠使用原生的字符串來設置這個屬性,但正式發佈時一定要引用字符串資源。

android:multiprocess

這個屬性用於設定是否能夠在每個使用該內容提供器的客戶端進程中都創建一個內容提供器的實例,如果設置爲true,這個能夠在其每個客戶端進程中創建一個實例,否則不可以。默認值是false。

通常,內容提供器是在定義它的應用程序的進程中被實例化的。但是,如果這個屬性被設置爲true,系統就能夠在每個要與該內容提供器進行交互的客戶端進程中創建一個內容提供器的實例,這樣就避免了進程間通信的開銷。

android:name

這個屬性用於定義內容提供器的實現類的名稱,它是ContentProvider類的一個子類。這個屬性應該使用完整的Java類名來設定(如:com.example.project.TransportationProvider)。但是也可以使用簡寫(如:.TransporttationProvider),這時系統會使用元素中指定的包名跟這個簡寫名稱的組合來識別內容提供器。

這個屬性沒有默認值,必須要給這個屬性設定一個名稱。

android:permission

這個屬性用於設定客戶端在讀寫內容提供器的數據時必須要有的權限的名稱。這個屬性爲同時設置讀寫權限提供了一種便利的方法。但是readPermission和writePermission屬性的優先級要比這個屬性高。如果readPermission屬性也被設置了,那麼它就會控制對內容提供器的查詢訪問。如果writePermission屬性被設置,它就會控制對內容提供器數據的修改訪問。

android:process

這個屬性用於定義內容提供器應該運行在那個進程中的進程名稱。通常,應用程序的所有組件都運行在給應用程序創建的默認進程中。它有與應用程序包相同的名稱。元素的process屬性能夠給其所有的組件設置一個不同的默認進程。但是每個組件都能夠用它們自己的process屬性來覆蓋這個默認設置,從而允許把應用程序分離到不同的多個進程中。

如果這個屬性值是用“:”開頭的,那麼在需要這個提供器的時候,系統就會給這個應用程序創建一個新的私有進程,並且對應的Activity也要運行在那個私有進程中。如果用小寫字母開頭,那麼Activity則會運行在一個用這個屬性值命名的全局進程中,它提供了對內容提供器的訪問權限。這樣就允許不同應用程序的組件能夠共享這個進程,從而減少對系統資源的使用。

android:readPermission

這個屬性用於設置查詢內容提供器的數據時,客戶端所必須要有的權限。

android:syncable

這個屬性用於設定內容提供器控制下的數據是否要與服務器上的數據進行同步,如果設置爲true,則要同步,否則不需要同步。

android:writePermission

這個屬性用於設置修改內容提供器的數據時,客戶端所必須要有的權限。

被引入的版本(INTRODUCED IN):

API Level 1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章