Android復習(三)清單文件中的元素——> provider、receiver、service
<provider>
- 語法:
-
<provider android:authorities="list" android:directBootAware=["true" | "false"] 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>- 說明:
- 聲明內容提供程序組件。內容提供程序是
ContentProvider的子類,可提供對由應用管理的數據的結構化訪問機制。應用中的所有內容提供程序都必須在清單文件的<provider>元素中定義;否則,系統將不知道它們,也不會運行它們。您只能聲明屬于您的應用的內容提供程序,而不應聲明在您的應用中使用的屬于其他應用的內容提供程序。
Android 系統根據授權方字符串(提供程序的內容 URI 的一部分)來存儲對內容提供程序的引用。例如,假設您想要訪問用來存儲專業醫護人員相關信息的內容提供程序。為此,您可以調用
ContentResolver.query()方法,它接受用來標識提供程序的 URI(以及其他參數):content://com.example.project.healthcareprovider/nurses/rn
content:架構將 URI 標識為指向 Android 內容提供程序的內容 URI。授權方com.example.project.healthcareprovider標識提供程序本身;Android 系統會在已知提供程序及其授權方的列表中查詢該授權方。子字符串nurses/rn是一個路徑,內容提供程序可使用它來標識提供程序數據的子集。請注意,在
<provider>元素中定義提供程序時,請勿在android:name參數中添加架構或路徑,只能添加授權方。如需了解如何使用和開發內容提供程序,請參閱 API 指南 - 內容提供程序。
- 屬性:
android:authorities- 一個或多個 URI 授權方的列表,這些 URI 授權方用于標識內容提供程序提供的數據。列出多個授權方時,用分號將其名稱分隔開來。為避免沖突,授權方名稱應遵循 Java 樣式的命名慣例(如
com.example.provider.cartoonprovider)。通常,它是實現提供程序的ContentProvider子類的名稱。沒有默認值。必須至少指定一個授權方。
android:enabled- 系統是否可以實例化內容提供程序。如果可以,則設為“
true”;如果不能,則設為“false”。默認值為“true”。<application>元素具有自己的enabled屬性,該屬性適用于所有應用組件,包括內容提供程序。<application>和<provider>屬性必須都為“true”(這正是它們兩者的默認設置),才會啟用內容提供程序。如果其中任一屬性為“false”,就會停用提供程序;無法將其實例化。 android:directBootAware-
內容提供程序是否可感知直接啟動 (direct-boot);即,它是否可以在用戶解鎖設備之前運行。
注意:在直接啟動期間,應用中的內容提供程序只能訪問設備保護存儲空間內的數據。
默認值為
"false"。 android:exported- 內容提供程序是否可供其他應用使用:
true:提供程序可供其他應用使用。任何應用均可使用提供程序的內容 URI 來訪問它,但需依據為提供程序指定的權限進行訪問。false:提供程序不可供其他應用使用。設置android:exported="false"可僅限您的應用訪問提供程序。只有與提供程序具有相同的用戶 ID (UID) 的應用或者通過android:grantUriPermissions元素被臨時授予對提供程序的訪問權限的應用才能訪問提供程序。
由于此屬性是在 API 級別 17 中引入的,因此所有搭載 API 級別 16 及更低級別的設備的行為方式就像將此屬性設為
"true"一樣。對于搭載 API 級別 17 及更高級別的設備,如果您將android:targetSdkVersion設為 17 或更高版本,則默認值為"false"。您可以設置
android:exported="false"并且仍然限制對提供程序的訪問,方法是使用permission屬性來設置相應權限。 android:grantUriPermissions- 是否可以向一般無權訪問內容提供程序的數據的組件授予訪問這些數據的權限,從而暫時克服由
readPermission、writePermission、permission和exported屬性施加的限制。如果可以授予權限,則設為“true”;如果不能授予權限,則設為“false”。如果設為“true”,則可以授予對內容提供程序的任何數據的權限。如果設為“false”,則只能授予對<grant-uri-permission>子元素中列出的數據子集(如果有)的權限。默認值為“false”。通過授予權限,可讓應用組件對受權限保護的數據進行一次性訪問。例如,當電子郵件包含附件時,郵件應用可以要求適當的查看器來打開它,即使該查看器沒有查看內容提供程序的所有數據的常規權限也是如此。
在這種情況下,通過用于激活組件的 Intent 對象中的
FLAG_GRANT_READ_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSION標志來授予權限。例如,郵件應用可能會將FLAG_GRANT_READ_URI_PERMISSION放入傳遞給Context.startActivity()的 Intent。權限特定于 Intent 中的 URI。如果您通過將此屬性設為“
true”或通過定義<grant-uri-permission>子元素來啟用此功能,則必須在從提供程序中刪除覆蓋的 URI 后調用Context.revokeUriPermission()。另請參閱
<grant-uri-permission>元素。 android:icon- 一個表示內容提供程序的圖標。必須將此屬性設為對包含圖片定義的可繪制資源的引用。如果未設置此屬性,則改用為整個應用指定的圖標(請參閱
<application>元素的icon屬性)。 android:initOrder- 應按什么順序實例化內容提供程序,這是相對于由同一進程托管的其他內容提供程序的順序。當內容提供程序之間存在依賴關系時,為每個提供程序設置此屬性可確保按這些依賴關系要求的順序創建這些提供程序。值是一個簡單的整數,數值越高,初始化順序越靠前。
android:label- 所提供內容的用戶可讀標簽。如果未設置此屬性,則改用為整個應用設置的標簽(請參閱
<application>元素的label屬性)。應將標簽設為對字符串資源的引用,以便可以像界面中的其他字符串一樣進行本地化。不過,為了方便您開發應用,也可以將其設為原始字符串。
android:multiprocess- 如果應用在多個進程中運行,則此屬性決定了是否會創建內容提供程序的多個實例。如果設為
true,則每個應用進程都有自己的內容提供程序對象。如果設為false,則應用的進程僅共享一個內容提供程序對象。默認值為false。將此標志設為
true可以通過減少進程間通信的開銷來提高性能,但也會增加每個進程的內存占用量。 android:name- 實現內容提供程序的類的名稱,它是
ContentProvider的子類。這應該是一個完全限定類名(如“com.example.project.TransportationProvider”)。不過,作為一種簡寫形式,如果名稱的第一個字符是句點,則會將其附加到<manifest>元素中指定的軟件包名稱。沒有默認值。必須指定相應名稱。
android:permission- 客戶端為了讀取或寫入內容提供程序的數據而必須具備的權限的名稱。使用此屬性可以方便地設置適用于讀取和寫入的單一權限。不過,
readPermission、writePermission和grantUriPermissions屬性優先于此屬性。如果也設置了readPermission屬性,則該屬性控制對查詢內容提供程序的訪問權限。如果設置了writePermission屬性,則該屬性控制對修改提供程序的數據的訪問權限。 android:process- 一個進程的名稱,內容提供程序應在該進程中運行。通常,應用的所有組件都在為應用創建的默認進程中運行。它與應用軟件包的名稱相同。
<application>元素的process屬性可以為所有組件設置不同的默認值。但是,每個組件都可以使用自己的process屬性來替換默認值,從而允許您讓應用跨越多個進程。如果為此屬性分配的名稱以冒號(“:”)開頭,則會在需要時創建一個應用專用的新進程,并且 Activity 將在該進程中運行。如果進程名稱以小寫字符開頭,則 Activity 將在采用該名稱的全局進程中運行,前提是它具有相應權限。這樣,不同應用中的組件就可以共享進程,從而減少資源使用量。
android:readPermission-
客戶端要查詢內容提供程序而必須具備的權限。
如果提供程序將
android:grantUriPermissions設為true,或者如果給定的客戶端滿足<grant-uri-permission>子元素的條件,則客戶端可以獲得對內容提供程序的數據的臨時讀取訪問權限。另請參閱
permission和writePermission屬性。 android:syncable- 由內容提供程序控制的數據是否要與服務器上的數據同步。如果要同步,則設為“
true”;如果不同步,則設為“false”。 android:writePermission-
客戶端要對由內容提供程序控制的數據進行更改而必須具備的權限。
如果提供程序將
android:grantUriPermissions設為true,或者如果給定的客戶端滿足<grant-uri-permission>子元素的條件,則客戶端可以獲得對修改內容提供程序的數據的臨時寫入訪問權限。另請參閱
permission和readPermission屬性。
<receiver>
- 語法:
-
<receiver android:directBootAware=["true" | "false"] android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string" > . . . </receiver> - 包含于:
<application>- 可包含:
<intent-filter><meta-data>- 說明:
- 將廣播接收器(
BroadcastReceiver子類)聲明為應用的組件之一。廣播接收器允許應用接收由系統或其他應用廣播的 Intent,即使應用的其他組件并沒有運行也是如此。讓系統知道廣播接收器有兩種方法:一種方法是使用此元素在清單文件中聲明廣播接收器。另一種方法是在代碼中動態創建接收器,并使用
Context.registerReceiver()方法注冊接收器。如需詳細了解如何動態創建接收器,請參閱BroadcastReceiver類說明。警告:限制您在應用中設置的廣播接收器的數量。廣播接收器過多會影響應用的性能及用戶設備的電池續航時間。如需詳細了解您可以用于安排后臺工作的 API(而不是
BroadcastReceiver類),請參閱后臺優化。 - 屬性:
android:directBootAware-
廣播接收器是否可感知直接啟動;即,它是否可以在用戶解鎖設備之前運行。
注意:在直接啟動期間,應用中的廣播接收器只能訪問存儲在設備保護存儲區中的數據。
默認值為
"false"。 android:enabled- 系統是否可以實例化廣播接收器;如果可以,則為“
true”,如果不可以,則為“false”。默認值為“true”。<application>元素有自己的enabled屬性,該屬性會應用于所有應用組件(包括廣播接收器)。要啟用廣播接收器,<application>和<receiver>屬性都必須為“true”。如果其中一個屬性為“false”,則表示廣播接收器已停用;無法對其進行實例化。 android:exported- 廣播接收器是否可以接收來自其應用外部來源的消息 - 如果可以,則為“
true”,如果不可以,則為“false”。如果為“false”,則廣播接收器只能接收由同一應用或具有相同用戶 ID 的應用的組件發送的消息。默認值取決于廣播接收器是否包含 Intent 過濾器。沒有任何過濾器意味著只能由指定其確切類名稱的 Intent 對象調用。這意味著接收器僅供應用內部使用(因為其他應用通常不知道類名稱)。因此,在這種情況下,默認值為“
false”。另一方面,至少存在一個過濾器意味著廣播接收器用于接收由系統或其他應用廣播的 Intent,所以默認值為“true”。此屬性不是限制廣播接收器對外公開的唯一方式。您還可以使用權限來限制可向其發送消息的外部實體(請參閱
permission屬性)。 android:icon- 表示廣播接收器的圖標。此屬性必須設置為對包含圖片定義的可繪制資源的引用。如果未設置,則改用為整個應用指定的圖標(請參閱
<application>元素的icon屬性)。廣播接收器的圖標(無論是在此處設置還是由
<application>元素設置)也是接收器的所有 Intent 過濾器的默認圖標(請參閱<intent-filter>元素的icon屬性)。 android:label- 廣播接收器的用戶可讀標簽。如果未設置此屬性,則改用整個應用的標簽集(請參閱
<application>元素的label屬性)。廣播接收器的標簽(無論是在此處設置還是由
<application>元素設置)也是接收器的所有 Intent 過濾器的默認標簽(請參閱<intent-filter>元素的label屬性)。此標簽應設置為對字符串資源的引用,以便可以像界面中的其他字符串一樣進行本地化。不過,為了方便您開發應用,還可以將此標簽設置為原始字符串。
android:name- 實現廣播接收器的類(
BroadcastReceiver的子類)的名稱。此名稱應該是一個完全限定類名稱(如“com.example.project.ReportReceiver”)。不過,作為一種簡寫形式,如果名稱的第一個字符是句點,(如“. ReportReceiver”),則會將其附加到<manifest>元素中指定的軟件包名稱。發布應用后,不能更改此名稱(除非您已設置
android:exported="false")。沒有默認值。必須指定此名稱。
android:permission- 廣播方要向廣播接收器發送消息而必須具備的權限的名稱。如果未設置此屬性,則由
<application>元素的permission屬性設置的權限會應用于廣播接收器。如果這兩個屬性均未設置,則接收器不受權限保護。 android:process- 廣播接收器應在其中運行的進程的名稱。通常,應用的所有組件都會在為應用創建的默認進程中運行。它的名稱與應用軟件包的名稱相同。
<application>元素的process屬性可以為所有組件設置不同的默認值。不過,每個組件都可以使用其自己的process屬性替換默認屬性,從而允許您跨多個進程分布應用。如果分配給此屬性的名稱以冒號(“:”)開頭,則系統會在需要時創建一個只有該應用可見的新進程,然后廣播接收器會在該進程中運行。 如果進程名稱以小寫字符開頭,則接收器會在使用該名稱的全局進程中運行,前提是它有權執行此操作。這樣,不同應用中的組件可以共用一個進程,從而減少資源使用量。
<service>
- 語法:
-
<service android:description="string resource"
android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:foregroundServiceType=["connectedDevice" | "dataSync" |
"location" | "mediaPlayback" | "mediaProjection" |
"phoneCall"]
android:icon="drawable resource"
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</service> - 包含它的文件:
<application>- 可包含:
<intent-filter><meta-data>- 說明:
- 將服務(
Service子類)聲明為應用的一個組件。與 Activity 不同,服務缺少可視化界面。服務用于實現長時間運行的后臺操作,或可由其他應用調用的富通信 API。必須用清單文件中的
<service>元素表示所有服務。系統不會識別和運行任何未進行聲明的服務。 - 屬性:
android:description- 向用戶描述服務的字符串。您應將此標簽設置為對字符串資源的引用,以便可以像對界面中的其他字符串那樣對其進行本地化。
android:directBootAware-
服務是否支持直接啟動,即其是否可以在用戶解鎖設備之前運行。
注意:在直接啟動期間,應用中的服務僅可訪問存儲在設備保護存儲區的數據。
默認值為
"false"。 android:enabled- 系統是否可實例化服務 —“
true”表示可以,“false”表示不可以。默認值為“true”。<application>元素擁有自己的enabled屬性,該屬性適用于所有應用組件,包括服務。只有在<application>和<service>屬性都為“true”(因為它們都默認使用該值)時,系統才能啟用服務。任何一項為“false”都會造成服務停用,從而使系統無法將其實例化。 android:exported- 其他應用的組件是否能調用服務或與之交互 —“
true”表示可以,“false”表示不可以。當該值為“false”時,只有同一個應用或具有相同用戶 ID 的應用的組件可以啟動服務或綁定到服務。默認值取決于服務是否包含 Intent 過濾器。沒有任何過濾器意味著服務只能通過指定其確切的類名稱進行調用。這意味著服務專供應用內部使用(因為其他應用不知曉其類名稱)。因此,在這種情況下,默認值為“
false”。另一方面,至少存在一個過濾器意味著服務專供外部使用,因此默認值為“true”。此屬性并非是唯一限制向其他應用披露服務的方式。您還可使用權限來限制哪些外部實體可以與服務交互(請參閱
permission屬性)。 android:foregroundServiceType-
闡明服務是滿足特定用例要求的前臺服務。例如,
"location"類型的前臺服務表示應用正在獲取設備的當前位置,目的通常是繼續用戶發起的操作,且該操作與設備位置相關。您可以將多個前臺服務類型分配給特定服務。
android:icon- 表示服務的圖標。必須將該屬性設置為對包含圖像定義的可繪制資源的引用。如果未設置該屬性,則轉而使用為應用整體指定的圖標(請參閱
<application>元素的icon屬性)。服務的圖標(無論是在此處設置,還是由
<application>元素設置)同時也是服務所有 Intent 過濾器的默認圖標(請參閱<intent-filter>元素的icon屬性)。 android:isolatedProcess- 如果設置為 true,則此服務將在與系統其余部分隔離的特殊進程下運行。此服務自身沒有權限,只能通過 Service API 與其進行通信(綁定和啟動)。
android:label- 可向用戶顯示的服務名稱。如果未設置該屬性,則轉而使用為應用整體設置的標簽(請參閱
<application>元素的label屬性)。服務的標簽(無論是在此處設置,還是由
<application>元素設置)同時也是服務所有 Intent 過濾器的默認標簽(請參閱<intent-filter>元素的label屬性)。您應將此標簽設置為對字符串資源的引用,以便可以像對界面中的其他字符串那樣對其進行本地化。不過,為便于開發應用,您也可將其設置為原始字符串。
android:name- 實現服務的
Service子類的名稱。此名稱應為完全限定類名稱(例如“com.example.project.RoomService”)。不過,為簡便起見,如果名稱的第一個字符是句點(例如,“.RoomService”),則名稱將追加至<manifest>元素中指定的軟件包名稱。一旦發布應用,即不應更改該名稱(除非您設置了
android:exported="false")。沒有默認值。必須指定該名稱。
android:permission- 實體啟動服務或綁定到服務所必需的權限的名稱。如果
、startService()或bindService()的調用者尚未獲得此權限,該方法將不起作用,且系統不會將 Intent 對象傳送給服務。stopService()如果未設置該屬性,則對服務應用由
<application>元素的permission屬性所設置的權限。如果二者均未設置,則服務不受權限保護。 android:process- 將運行服務的進程的名稱。正常情況下,應用的所有組件都會在為應用創建的默認進程中運行。該名稱與應用軟件包的名稱相同。
<application>元素的process屬性可為所有組件設置不同的默認進程名稱。不過,組件可以使用自己的process屬性替換默認值,讓您可以將應用散布到多個進程中。如果為此屬性分配的名稱以冒號(“:”)開頭,則系統會在需要時創建應用專用的新進程,并且服務會在該進程中運行。如果進程名稱以小寫字符開頭,則服務將在使用該名稱的全局進程中運行,前提是它擁有相應的權限。如此一來,不同應用中的組件便可共享進程,從而減少資源使用。

浙公網安備 33010602011771號