Android官方文件—APP清單(概述)
APP清單檔案
每個應用程式必須在其根目錄中包含一個AndroidManifest.xml檔案(具有該名稱)。清單檔案向Android系統提供有關您的應用程式的基本資訊,系統在執行任何應用程式程式碼之前必須具備這些資訊。
除其他外,清單檔案執行以下操作:
- 它為應用程式命名Java包。包名稱用作應用程式的唯一識別符號。
- 它描述了應用程式的元件,包括組成應用程式的活動,服務,廣播接收器和內容提供程式。它還命名實現每個元件的類併發布它們的功能,例如它們可以處理的Intent訊息。這些宣告通知Android系統元件及其啟動條件。
- 它確定承載應用程式元件的程序。
- 它聲明瞭應用程式必須具有的許可權,以便訪問API的受保護部分並與其他應用程式互動。它還聲明瞭其他人需要具有的許可權才能與應用程式的元件進行互動。
- 它列出了Instrumentation類,它們在應用程式執行時提供分析和其他資訊。只有在開發應用程式時才會在清單中顯示這些宣告,並在應用程式釋出之前將其刪除。
- 它聲明瞭應用程式所需的最低Android API級別。
- 它列出了應用程式必須連結的庫。
注意:在準備Android應用程式以在Chromebook上執行時,您應該考慮一些重要的硬體和軟體功能限制。有關詳細資訊,請參閱適用於Chromebook的App Manifest Compatibility文件。
清單檔案結構
下面的程式碼片段顯示了清單檔案的一般結構以及它可以包含的每個元素。每個元素及其所有屬性都在一個單獨的檔案中完整記錄。
提示:要檢視有關本文件文字中提到的任何元素的詳細資訊,只需單擊元素名稱即可。
以下是清單檔案的示例:
<?xml version="1.0" encoding="utf-8"?> <manifest> <uses-permission /> <permission /> <permission-tree /> <permission-group /> <instrumentation /> <uses-sdk /> <uses-configuration /> <uses-feature /> <supports-screens /> <compatible-screens /> <supports-gl-texture /> <application> <activity> <intent-filter> <action /> <category /> <data /> </intent-filter> <meta-data /> </activity> <activity-alias> <intent-filter> . . . </intent-filter> <meta-data /> </activity-alias> <service> <intent-filter> . . . </intent-filter> <meta-data/> </service> <receiver> <intent-filter> . . . </intent-filter> <meta-data /> </receiver> <provider> <grant-uri-permission /> <meta-data /> <path-permission /> </provider> <uses-library /> </application> </manifest>
以下列表包含可以按字母順序顯示在清單檔案中的所有元素:
注意:這些是唯一合法的元素 - 您無法新增自己的元素或屬性。
檔案約定
本節介紹通常適用於清單檔案中所有元素和屬性的約定和規則。
Elements
只需要<manifest>和<application>元素。它們必須存在且只能出現一次。大多數其他元素可以多次出現或根本不出現。但是,在清單檔案變得有用之前,必須至少存在其中一些。
如果元素包含任何內容,則它包含其他元素。所有值都是通過屬性設定的,而不是元素中的字元資料。
同一級別的元素通常不是有序的。例如,<activity>,<provider>和<service>元素可以按任何順序混合。此規則有兩個關鍵的例外情況:
<activity-alias>元素必須遵循作為別名的<activity>。
<application>元素必須是<manifest>元素中的最後一個元素。換句話說,</ application>結束標記必須緊跟在</ manifest>結束標記之前。
Attributes
在形式上,所有屬性都是可選的。但是,必須指定一些屬性,以便元素可以實現其目的。使用文件作為指南。對於真正的可選屬性,它會提到預設值或說明在沒有規範的情況下會發生什麼。
除了root <manifest>元素的某些屬性外,所有屬性名稱都以android:字首開頭。例如,android:alwaysRetainTaskState。由於字首是通用的,因此在按名稱引用屬性時,文件通常會省略它。
Declaring class names
許多元素對應於Java物件,包括應用程式本身的元素(<application>元素)及其主要元件:活動(<activity>),服務(<service>),廣播接收器(<receiver>)和內容提供者(<提供商>)。
如果定義子類,就像元件類(Activity,Service,BroadcastReceiver和ContentProvider)幾乎總是那樣,子類是通過name屬性宣告的。名稱必須包括完整的包裝名稱。例如,Service子類可能宣告如下:
<manifest . . . >
<application . . . >
<service android:name="com.example.project.SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
但是,如果字串的第一個字元是句點,則應用程式的包名稱(由<manifest>元素的包屬性指定)將附加到字串。以下分配與上面顯示的相同:
<manifest package="com.example.project" . . . >
<application . . . >
<service android:name=".SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
啟動元件時,Android系統會建立指定子類的例項。如果未指定子類,則會建立基類的例項。
Multiple values
如果可以指定多個值,則幾乎總是重複該元素,而不是在單個元素中列出多個值。例如,intent過濾器可以列出幾個操作:
<intent-filter . . . >
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.INSERT" />
<action android:name="android.intent.action.DELETE" />
. . .
</intent-filter>
Resource values
某些屬性具有可以向用戶顯示的值,例如活動的標籤和圖示。應該從資源或主題中對這些屬性的值進行本地化和設定。資源值以以下格式表示:
@[<i>package</i>:]<i>type</i>/<i>name</i>
如果資源與應用程式位於同一個程式包中,則可以省略程式包名稱。型別是一種資源,例如string或drawable,name是標識特定資源的名稱。這是一個例子:
<activity android:icon="@drawable/smallPic" . . . >
主題中的值表達方式相似,但是初始值是?代替 @:
?[<i>package</i>:]<i>type</i>/<i>name</i>
String values
如果屬性值是字串,則必須使用雙反斜槓(\\)來轉義字元,例如換行符為\\ n,Unicode字元為\\ uxxxx。
檔案功能
以下部分描述了清單檔案中反映某些Android功能的方式。
意圖過濾器
應用程式的核心元件(例如其活動,服務和廣播接收器)由意圖啟用。 intent是描述所需操作的資訊包(Intent物件),包括要執行操作的資料,應執行操作的元件類別以及其他相關指令。 Android系統找到可以響應意圖的適當元件,如果需要,則啟動元件的新例項,並將其傳遞給Intent物件。
元件通告意圖過濾器可以響應的意圖型別。由於Android系統必須瞭解元件在啟動元件之前可以處理的意圖,因此在清單中將意圖過濾器指定為<intent-filter>元素。元件可以包含任意數量的過濾器,每個過濾器都描述不同的功能。
顯式命名目標元件的intent會啟用該元件,因此過濾器不起作用。未按名稱指定目標的intent只有在可以通過元件的某個過濾器時才能啟用元件。
有關如何針對意圖過濾器測試Intent物件的資訊,請參閱意圖和意圖過濾器文件。
圖示和標籤
許多元素具有可以向用戶顯示的小圖示和文字標籤的圖示和標籤屬性。有些還有一個描述屬性,用於更長的解釋性文字,也可以在螢幕上顯示。例如,<permission>元素具有所有這三個屬性,因此當詢問使用者是否將許可權授予已請求它的應用程式時,表示許可權的圖示,許可權的名稱以及描述它所包含的內容都呈現給使用者。
在每種情況下,在包含元素中設定的圖示和標籤將成為所有容器子元素的預設圖示和標籤設定。因此,<application>元素中設定的圖示和標籤是每個應用程式元件的預設圖示和標籤。同樣,為元件設定的圖示和標籤(例如<activity>元素)是每個元件的<intent-filter>元素的預設設定。如果<application>元素設定標籤,但活動及其intent過濾器不設定,則應用程式標籤將被視為活動和intent過濾器的標籤。
每當元件呈現給使用者並完成過濾器通告的功能時,為意圖過濾器設定的圖示和標籤表示元件。例如,具有android.intent.action.MAIN和android.intent.category.LAUNCHER設定的過濾器將活動通告為啟動應用程式的活動。也就是說,應該在應用程式啟動器中顯示。過濾器中設定的圖示和標籤顯示在啟動器中。
Permissions
許可權是限制訪問部分程式碼或裝置上資料的限制。限制是為了保護可能被濫用以破壞或破壞使用者體驗的關鍵資料和程式碼。 每個許可權都由唯一標籤標識。標籤通常表示受限制的行為。以下是Android定義的一些許可權:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
只有一個許可權知道保護一類功能。
如果應用程式需要訪問受許可權保護的功能,則必須宣告它需要具有清單中<uses-permission>元素的許可權。當應用程式安裝在裝置上時,安裝程序通過檢查簽署應用程式證書的許可權並在某些情況下詢問使用者來確定是否授予所請求的許可權。如果授予了許可權,則應用程式可以使用受保護的功能。如果沒有,則在沒有任何通知使用者的情況下,它嘗試訪問這些功能會失敗。
應用程式還可以使用許可權保護自己的元件。它可以使用Android定義的任何許可權,如android.Manifest.permission中所列,或由其他應用程式宣告。它也可以定義自己的。使用<permission>元素宣告新許可權。例如,活動可以受到如下保護:
<manifest . . . >
<permission android:name="com.example.project.DEBIT_ACCT" . . . />
<uses-permission android:name="com.example.project.DEBIT_ACCT" />
. . .
<application . . .>
<activity android:name="com.example.project.FreneticActivity"
android:permission="com.example.project.DEBIT_ACCT"
. . . >
. . .
</activity>
</application>
</manifest>
請注意,在此示例中,DEBIT_ACCT許可權不僅使用<permission>元素宣告,還使用<uses-permission>元素請求其使用。您必須請求使用它,以便應用程式的其他元件啟動受保護的活動,即使應用程式本身強加了保護。
如果在上面顯示的相同示例中,許可權屬性設定為在其他地方宣告的許可權,例如android.permission.CALL_EMERGENCY_NUMBERS,則不必使用<permission>元素再次宣告它。但是,仍然需要使用<uses-permission>來請求它的使用。
<permission-tree>元素聲明瞭一組在程式碼中定義的許可權的名稱空間,<permission-group>定義了一組許可權的標籤,這兩個許可權都是在清單中使用<permission>元素宣告的那些許可權和那些在別處宣佈。這僅影響在向用戶呈現時許可權的分組方式。 <permission-group>元素未指定屬於該組的許可權,但它為該組指定了名稱。您可以通過將組名分配給<permission>元素的permissionGroup屬性來在組中放置許可權。
Libraries
每個應用程式都連結到預設的Android庫,其中包括用於構建應用程式的基本包(使用公共類,如Activity,Service,Intent,View,Button,Application和ContentProvider)。
但是,有些軟體包位於自己的庫中。如果您的應用程式使用任何這些軟體包中的程式碼,則必須明確要求將它們連結起來。清單必須包含一個單獨的<uses-library>元素來命名每個庫。您可以在包的文件中找到庫名。