應(yīng)用清單
每個(gè)應(yīng)用的根目錄中都必須包含一個(gè) AndroidManifest.xml 文件(且文件名精確無(wú)誤)。 清單文件向 Android 系統(tǒng)提供應(yīng)用的必要信息,系統(tǒng)必須具有這些信息方可運(yùn)行應(yīng)用的任何代碼。
此外,清單文件還可執(zhí)行以下操作:
- 為應(yīng)用的 Java 軟件包命名。軟件包名稱充當(dāng)應(yīng)用的唯一標(biāo)識(shí)符。
- 描述應(yīng)用的各個(gè)組件,包括構(gòu)成應(yīng)用的 Activity、服務(wù)、廣播接收器和內(nèi)容提供程序。它還為實(shí)現(xiàn)每個(gè)組件的類命名并發(fā)布其功能,例如它們可以處理的 Intent消息。這些聲明向 Android 系統(tǒng)告知有關(guān)組件以及可以啟動(dòng)這些組件的條件的信息。
- 確定托管應(yīng)用組件的進(jìn)程。
- 聲明應(yīng)用必須具備哪些權(quán)限才能訪問(wèn) API 中受保護(hù)的部分并與其他應(yīng)用交互。還聲明其他應(yīng)用與該應(yīng)用組件交互所需具備的權(quán)限
- 列出 Instrumentation類,這些類可在應(yīng)用運(yùn)行時(shí)提供分析和其他信息。這些聲明只會(huì)在應(yīng)用處于開發(fā)階段時(shí)出現(xiàn)在清單中,在應(yīng)用發(fā)布之前將移除
- 聲明應(yīng)用所需的最低 Android API 級(jí)別
- 列出應(yīng)用必須鏈接到的庫(kù)
清單文件結(jié)構(gòu)
下面的代碼段顯示了清單文件的通用結(jié)構(gòu)及其可包含的每個(gè)元素。每個(gè)元素及其所有屬性全部記錄在一個(gè)單獨(dú)的文件中。
下面是清單文件的示例:
<?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>
以下列表包含可出現(xiàn)在清單文件中的所有元素,按字母順序列出:
- <action>
- <activity>
- <activity-alias>
- <application>
- <category>
- <data>
- <grant-uri-permission>
- <instrumentation>
- <intent-filter>
- <manifest>
- <meta-data>
- <permission>
- <permission-group>
- <permission-tree>
- <provider>
- <receiver>
- <service>
- <supports-screens>
- <uses-configuration>
- <uses-feature>
- <uses-library>
- <uses-permission>
- <uses-sdk>
注:這些是僅有的合法元素 – 您無(wú)法添加自己的元素或?qū)傩浴?/p>
文件約定
本節(jié)描述普遍適用于清單文件中所有元素和屬性的約定和規(guī)則。
元素
只有 <manifest> 和 <application> 元素是必需的,它們都必須存在并且只能出現(xiàn)一次。其他大部分元素可以出現(xiàn)多次或者根本不出現(xiàn)。但清單文件中必須至少存在其中某些元素才有用。
如果一個(gè)元素包含某些內(nèi)容,也就包含其他元素。所有值均通過(guò)屬性進(jìn)行設(shè)置,而不是通過(guò)元素內(nèi)的字符數(shù)據(jù)設(shè)置。
同一級(jí)別的元素通常不分先后順序。例如,<activity>、<provider>和 <service> 元素可以按任何順序混合在一起。這條規(guī)則有兩個(gè)主要例外:
- <activity-alias> 元素必須跟在別名所指的 <activity> 之后。
- <application>元素必須是 <manifest> 元素內(nèi)最后一個(gè)元素。換言之,</manifest> 結(jié)束標(biāo)記必須緊接在 </application>結(jié)束標(biāo)記后。
屬性
從某種意義上說(shuō),所有屬性都是可選的。但是,必須指定某些屬性,元素才可實(shí)現(xiàn)其目的。請(qǐng)使用本文檔作為參考。對(duì)于真正可選的屬性,它將指定默認(rèn)值或聲明缺乏規(guī)范時(shí)將執(zhí)行何種操作。
除了根 <manifest>元素的一些屬性外,所有屬性名稱均以 android: 前綴開頭。例如,android:alwaysRetainTaskState。由于該前綴是通用的,因此在按名稱引用屬性時(shí),本文檔通常會(huì)將其忽略。
聲明類名
許多元素對(duì)應(yīng)于 Java 對(duì)象,包括應(yīng)用本身的元素(<application> 元素)及其主要組件:Activity (<activity>)、服務(wù) (<service>)、廣播接收器 (<receiver>) 以及內(nèi)容提供程序 (<provider>)。
如果按照您針對(duì)組件類(Activity、Service 和 BroadcastReceiver ContentProvider)幾乎一直采用的方式來(lái)定義子類,則該子類需通過(guò) name 屬性來(lái)聲明。該名稱必須包含完整的軟件包名稱。例如,Service 子類可能會(huì)聲明如下:
<manifest . . . >
<application . . . >
<service android:name="com.example.project.SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
但是,如果字符串的第一個(gè)字符是句點(diǎn),則應(yīng)用的軟件包名稱(如 <manifest>元素的 package 屬性所指定)將附加到該字符串。以下賦值與上述方法相同:
<manifest package="com.example.project" . . . >
<application . . . >
<service android:name=".SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
當(dāng)啟動(dòng)組件時(shí),Android 系統(tǒng)會(huì)創(chuàng)建已命名子類的實(shí)例。如果未指定子類,則會(huì)創(chuàng)建基類的實(shí)例。
多個(gè)值
如果可以指定多個(gè)值,則幾乎總是在重復(fù)此元素,而不是列出單個(gè)元素內(nèi)的多個(gè)值。例如,intent 過(guò)濾器可以列出多個(gè)操作:
<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>
資源值
某些屬性的值可以顯示給用戶,例如,Activity 的標(biāo)簽和圖標(biāo)。這些屬性的值應(yīng)該本地化,并通過(guò)資源或主題進(jìn)行設(shè)置。資源值用以下格式表示:
@[<i>package</i>:]<i>type</i>/<i>name</i>
如果資源與應(yīng)用在同一個(gè)軟件包中,可以省略軟件包名稱。類型是資源類型,例如字符串或可繪制對(duì)象,名稱是標(biāo)識(shí)特定資源的名稱。下面是示例:
<activity android:icon="@drawable/smallPic" . . . >
主題中的值用類似的方法表示,但是以 ? 開頭,而不是以 @ 開頭:
?[<i>package</i>:]<i>type</i>/<i>name</i>
字符串值
如果屬性值為字符串,則必須使用雙反斜杠 ( \ \ ) 轉(zhuǎn)義字符,例如,使用 \ \n 表示換行符或使用 \ \uxxxx 表示 Unicode 字符。
文件功能
下文介紹在清單文件中體現(xiàn)某些 Android 特性的方式。
Intent 過(guò)濾器
應(yīng)用的核心組件(例如其 Activity、服務(wù)和廣播接收器)由 intent 激活。Intent 是一系列用于描述所需操作的信息(Intent 對(duì)象),其中包括要執(zhí)行操作的數(shù)據(jù)、應(yīng)執(zhí)行操作的組件類別以及其他相關(guān)說(shuō)明。Android 系統(tǒng)會(huì)查找合適的組件來(lái)響應(yīng) intent,根據(jù)需要啟動(dòng)組件的新實(shí)例,并將其傳遞到 Intent對(duì)象。
組件將通過(guò) intent 過(guò)濾器公布它們可響應(yīng)的 intent 類型。由于Android 系統(tǒng)在啟動(dòng)某組件之前必須了解該組件可以處理的 intent,因此 intent 過(guò)濾器在清單中被指定為 <intent-filter> 元素。一個(gè)組件可有任意數(shù)量的過(guò)濾器,其中每個(gè)過(guò)濾器描述一種不同的功能。
顯式命名目標(biāo)組件的 intent 將激活該組件,因此過(guò)濾器不起作用。不按名稱指定目標(biāo)的 intent 只有在能夠通過(guò)組件的一個(gè)過(guò)濾器時(shí)才可激活該組件。
如需了解有關(guān)如何根據(jù) intent 過(guò)濾器測(cè)試 Intent 對(duì)象的信息,請(qǐng)參閱 Intent 和 Intent 過(guò)濾器文檔。
圖標(biāo)和標(biāo)簽
對(duì)于可以顯示給用戶的小圖標(biāo)和文本標(biāo)簽,大量元素具有 icon 和 label 屬性。此外,對(duì)于同樣可以顯示在屏幕上的較長(zhǎng)說(shuō)明文本,某些元素還具有 description 屬性。例如,<permission> 元素具有所有這三個(gè)屬性。因此,當(dāng)系統(tǒng)詢問(wèn)用戶是否授權(quán)給請(qǐng)求獲得權(quán)限的應(yīng)用時(shí),權(quán)限圖標(biāo)、權(quán)限名稱以及所需信息的說(shuō)明均會(huì)呈現(xiàn)給用戶。
無(wú)論何種情況下,在包含元素中設(shè)置的圖標(biāo)和標(biāo)簽都將成為所有容器子元素的默認(rèn) icon 和 label 設(shè)置。因此,在 <application> 元素中設(shè)置的圖標(biāo)和標(biāo)簽是每個(gè)應(yīng)用組件的默認(rèn)圖標(biāo)和標(biāo)簽。同樣,為組件(例如 <activity> 元素)設(shè)置的圖標(biāo)和標(biāo)簽是組件每個(gè) <intent-filter> 元素的默認(rèn)設(shè)置。如果 <application> 元素設(shè)置標(biāo)簽,但是 Activity 及其 intent 過(guò)濾器不執(zhí)行此操作,則應(yīng)用標(biāo)簽將被視為 Activity 和 intent 過(guò)濾器的標(biāo)簽。
在實(shí)現(xiàn)過(guò)濾器公布的功能時(shí),只要向用戶呈現(xiàn)組件,系統(tǒng)便會(huì)使用為 intent 過(guò)濾器設(shè)置的圖標(biāo)和標(biāo)簽表示該組件。例如,具有 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 設(shè)置的過(guò)濾器將 Activity 公布為可啟動(dòng)應(yīng)用的功能,即,公布為應(yīng)顯示在應(yīng)用啟動(dòng)器中的功能。在過(guò)濾器中設(shè)置的圖標(biāo)和標(biāo)簽顯示在啟動(dòng)器中。
權(quán)限
權(quán)限是一種限制,用于限制對(duì)部分代碼或設(shè)備上數(shù)據(jù)的訪問(wèn)。施加限制是為了保護(hù)可能被誤用以致破壞或損害用戶體驗(yàn)的關(guān)鍵數(shù)據(jù)和代碼。
每種權(quán)限均由一個(gè)唯一的標(biāo)簽標(biāo)識(shí)。標(biāo)簽通常指示受限制的操作。以下是 Android 定義的一些權(quán)限:
- android.permission.CALL_EMERGENCY_NUMBERS
- android.permission.READ_OWNER_DATA
- android.permission.SET_WALLPAPER
- android.permission.DEVICE_POWER
一個(gè)功能只能由一種權(quán)限保護(hù)。
如果應(yīng)用需要訪問(wèn)受權(quán)限保護(hù)的功能,則必須在清單中使用 <uses-permission> 元素聲明應(yīng)用需要該權(quán)限。將應(yīng)用安裝到設(shè)備上之后,安裝程序會(huì)通過(guò)檢查簽署應(yīng)用證書的頒發(fā)機(jī)構(gòu)并(在某些情況下)詢問(wèn)用戶,確定是否授予請(qǐng)求的權(quán)限。如果授予權(quán)限,則應(yīng)用能夠使用受保護(hù)的功能。否則,其訪問(wèn)這些功能的嘗試將會(huì)失敗,并且不會(huì)向用戶發(fā)送任何通知。
應(yīng)用也可以使用權(quán)限保護(hù)自己的組件。它可以采用由 Android 定義(如 android.Manifest.permission 中所列)或由其他應(yīng)用聲明的任何權(quán)限。它也可以定義自己的權(quán)限。新權(quán)限用 <permission> 元素來(lái)聲明。例如,Activity 可受到如下保護(hù):
<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>
請(qǐng)注意,在此示例中,DEBIT_ACCT 權(quán)限不僅是通過(guò) <permission> 元素來(lái)聲明,而且其使用也是通過(guò) <uses-permission> 元素來(lái)請(qǐng)求。要讓應(yīng)用的其他組件也能夠啟動(dòng)受保護(hù)的 Activity,您必須請(qǐng)求其使用權(quán)限,即便保護(hù)是由應(yīng)用本身施加的亦如此。
同樣還是在此示例中,如果將 permission 屬性設(shè)置為在其他位置(例如,android.permission.CALL_EMERGENCY_NUMBERS)聲明的權(quán)限,則無(wú)需使用 <permission> 元素再次聲明。但是,仍有必要通過(guò) <uses-permission> 請(qǐng)求其使用權(quán)限。
<permission-tree> 元素聲明為代碼中定義的一組權(quán)限聲明命名空間,<permission-group> 為一組權(quán)限定義標(biāo)簽,包括在清單中使用<permission>元素聲明的權(quán)限以及在其他位置聲明的權(quán)限。這只影響如何對(duì)提供給用戶的權(quán)限進(jìn)行分組。<permission-group> 元素并不指定屬于該組的權(quán)限,而只是為組提供名稱??赏ㄟ^(guò)向 <permission> 元素的 permissionGroup 屬性分配組名,將權(quán)限放入組中。
庫(kù)
每個(gè)應(yīng)用均鏈接到默認(rèn)的 Android 庫(kù),該庫(kù)中包括用于開發(fā)應(yīng)用(以及通用類,如 Activity、服務(wù)、intent、視圖、按鈕、應(yīng)用、ContentProvider)的基本軟件包。
但是,某些軟件包駐留在自己的庫(kù)中。如果應(yīng)用使用來(lái)自其中任一軟件包的代碼,則必須明確要求其鏈接到這些軟件包。清單必須包含單獨(dú)的 <uses-library> 元素來(lái)命名其中每個(gè)庫(kù)。庫(kù)名稱可在軟件包的文檔中找到。