應(yīng)用清單
每個(gè)應(yīng)用的根目錄中都必須包含一個(gè) AndroidManifest.xml 文件(且文件名精確無誤)。 清單文件向 Android 系統(tǒng)提供應(yīng)用的必要信息蜓洪,系統(tǒng)必須具有這些信息方可運(yùn)行應(yīng)用的任何代碼胯努。
此外牢裳,清單文件還可執(zhí)行以下操作:
- 為應(yīng)用的 Java 軟件包命名。軟件包名稱充當(dāng)應(yīng)用的唯一標(biāo)識符康聂。
- 描述應(yīng)用的各個(gè)組件贰健,包括構(gòu)成應(yīng)用的 Activity、服務(wù)恬汁、廣播接收器和內(nèi)容提供程序伶椿。它還為實(shí)現(xiàn)每個(gè)組件的類命名并發(fā)布其功能,例如它們可以處理的 Intent消息氓侧。這些聲明向 Android 系統(tǒng)告知有關(guān)組件以及可以啟動這些組件的條件的信息脊另。
- 確定托管應(yīng)用組件的進(jìn)程。
- 聲明應(yīng)用必須具備哪些權(quán)限才能訪問 API 中受保護(hù)的部分并與其他應(yīng)用交互约巷。還聲明其他應(yīng)用與該應(yīng)用組件交互所需具備的權(quán)限
- 列出 Instrumentation類偎痛,這些類可在應(yīng)用運(yùn)行時(shí)提供分析和其他信息。這些聲明只會在應(yīng)用處于開發(fā)階段時(shí)出現(xiàn)在清單中独郎,在應(yīng)用發(fā)布之前將移除
- 聲明應(yīng)用所需的最低 Android API 級別
- 列出應(yīng)用必須鏈接到的庫
清單文件結(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>
注:這些是僅有的合法元素 – 您無法添加自己的元素或?qū)傩浴?/p>
文件約定
本節(jié)描述普遍適用于清單文件中所有元素和屬性的約定和規(guī)則谓谦。
元素
只有 <manifest> 和 <application> 元素是必需的,它們都必須存在并且只能出現(xiàn)一次贪婉。其他大部分元素可以出現(xiàn)多次或者根本不出現(xiàn)反粥。但清單文件中必須至少存在其中某些元素才有用。
如果一個(gè)元素包含某些內(nèi)容,也就包含其他元素才顿。所有值均通過屬性進(jìn)行設(shè)置莫湘,而不是通過元素內(nèi)的字符數(shù)據(jù)設(shè)置。
同一級別的元素通常不分先后順序郑气。例如幅垮,<activity>、<provider>和 <service> 元素可以按任何順序混合在一起竣贪。這條規(guī)則有兩個(gè)主要例外:
- <activity-alias> 元素必須跟在別名所指的 <activity> 之后军洼。
- <application>元素必須是 <manifest> 元素內(nèi)最后一個(gè)元素。換言之演怎,</manifest> 結(jié)束標(biāo)記必須緊接在 </application>結(jié)束標(biāo)記后。
屬性
從某種意義上說避乏,所有屬性都是可選的爷耀。但是,必須指定某些屬性拍皮,元素才可實(shí)現(xiàn)其目的歹叮。請使用本文檔作為參考。對于真正可選的屬性铆帽,它將指定默認(rèn)值或聲明缺乏規(guī)范時(shí)將執(zhí)行何種操作咆耿。
除了根 <manifest>元素的一些屬性外,所有屬性名稱均以 android:
前綴開頭爹橱。例如萨螺,android:alwaysRetainTaskState
。由于該前綴是通用的愧驱,因此在按名稱引用屬性時(shí)慰技,本文檔通常會將其忽略。
聲明類名
許多元素對應(yīng)于 Java 對象组砚,包括應(yīng)用本身的元素(<application> 元素)及其主要組件:Activity (<activity>)吻商、服務(wù) (<service>)、廣播接收器 (<receiver>) 以及內(nèi)容提供程序 (<provider>)糟红。
如果按照您針對組件類(Activity艾帐、Service 和 BroadcastReceiver ContentProvider)幾乎一直采用的方式來定義子類,則該子類需通過 name
屬性來聲明盆偿。該名稱必須包含完整的軟件包名稱柒爸。例如,Service 子類可能會聲明如下:
<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)啟動組件時(shí),Android 系統(tǒng)會創(chuàng)建已命名子類的實(shí)例阳藻。如果未指定子類晰奖,則會創(chuàng)建基類的實(shí)例。
多個(gè)值
如果可以指定多個(gè)值腥泥,則幾乎總是在重復(fù)此元素匾南,而不是列出單個(gè)元素內(nèi)的多個(gè)值。例如蛔外,intent 過濾器可以列出多個(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)該本地化豹爹,并通過資源或主題進(jìn)行設(shè)置。資源值用以下格式表示:
@[<i>package</i>:]<i>type</i>/<i>name</i>
如果資源與應(yīng)用在同一個(gè)軟件包中矛纹,可以省略軟件包名稱臂聋。類型是資源類型,例如字符串或可繪制對象或南,名稱是標(biāo)識特定資源的名稱孩等。下面是示例:
<activity android:icon="@drawable/smallPic" . . . >
主題中的值用類似的方法表示,但是以 ? 開頭采够,而不是以 @ 開頭:
?[<i>package</i>:]<i>type</i>/<i>name</i>
字符串值
如果屬性值為字符串肄方,則必須使用雙反斜杠 ( \ \ ) 轉(zhuǎn)義字符,例如蹬癌,使用 \ \n 表示換行符或使用 \ \uxxxx 表示 Unicode 字符权她。
文件功能
下文介紹在清單文件中體現(xiàn)某些 Android 特性的方式。
Intent 過濾器
應(yīng)用的核心組件(例如其 Activity冀瓦、服務(wù)和廣播接收器)由 intent 激活伴奥。Intent 是一系列用于描述所需操作的信息(Intent 對象),其中包括要執(zhí)行操作的數(shù)據(jù)翼闽、應(yīng)執(zhí)行操作的組件類別以及其他相關(guān)說明拾徙。Android 系統(tǒng)會查找合適的組件來響應(yīng) intent,根據(jù)需要啟動組件的新實(shí)例感局,并將其傳遞到 Intent對象尼啡。
組件將通過 intent 過濾器公布它們可響應(yīng)的 intent 類型。由于Android 系統(tǒng)在啟動某組件之前必須了解該組件可以處理的 intent询微,因此 intent 過濾器在清單中被指定為 <intent-filter> 元素崖瞭。一個(gè)組件可有任意數(shù)量的過濾器,其中每個(gè)過濾器描述一種不同的功能撑毛。
顯式命名目標(biāo)組件的 intent 將激活該組件书聚,因此過濾器不起作用。不按名稱指定目標(biāo)的 intent 只有在能夠通過組件的一個(gè)過濾器時(shí)才可激活該組件。
如需了解有關(guān)如何根據(jù) intent 過濾器測試 Intent 對象的信息雌续,請參閱 Intent 和 Intent 過濾器文檔斩个。
圖標(biāo)和標(biāo)簽
對于可以顯示給用戶的小圖標(biāo)和文本標(biāo)簽,大量元素具有 icon
和 label
屬性驯杜。此外受啥,對于同樣可以顯示在屏幕上的較長說明文本,某些元素還具有 description
屬性鸽心。例如滚局,<permission> 元素具有所有這三個(gè)屬性。因此顽频,當(dāng)系統(tǒng)詢問用戶是否授權(quán)給請求獲得權(quán)限的應(yīng)用時(shí)藤肢,權(quán)限圖標(biāo)、權(quán)限名稱以及所需信息的說明均會呈現(xiàn)給用戶糯景。
無論何種情況下谤草,在包含元素中設(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 過濾器不執(zhí)行此操作略贮,則應(yīng)用標(biāo)簽將被視為 Activity 和 intent 過濾器的標(biāo)簽甚疟。
在實(shí)現(xiàn)過濾器公布的功能時(shí),只要向用戶呈現(xiàn)組件逃延,系統(tǒng)便會使用為 intent 過濾器設(shè)置的圖標(biāo)和標(biāo)簽表示該組件览妖。例如,具有 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 設(shè)置的過濾器將 Activity 公布為可啟動應(yīng)用的功能揽祥,即讽膏,公布為應(yīng)顯示在應(yīng)用啟動器中的功能。在過濾器中設(shè)置的圖標(biāo)和標(biāo)簽顯示在啟動器中拄丰。
權(quán)限
權(quán)限是一種限制府树,用于限制對部分代碼或設(shè)備上數(shù)據(jù)的訪問。施加限制是為了保護(hù)可能被誤用以致破壞或損害用戶體驗(yàn)的關(guān)鍵數(shù)據(jù)和代碼料按。
每種權(quán)限均由一個(gè)唯一的標(biāo)簽標(biāo)識奄侠。標(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)用需要訪問受權(quán)限保護(hù)的功能垄潮,則必須在清單中使用 <uses-permission> 元素聲明應(yīng)用需要該權(quán)限。將應(yīng)用安裝到設(shè)備上之后,安裝程序會通過檢查簽署應(yīng)用證書的頒發(fā)機(jī)構(gòu)并(在某些情況下)詢問用戶弯洗,確定是否授予請求的權(quán)限旅急。如果授予權(quán)限,則應(yīng)用能夠使用受保護(hù)的功能涂召。否則坠非,其訪問這些功能的嘗試將會失敗,并且不會向用戶發(fā)送任何通知果正。
應(yīng)用也可以使用權(quán)限保護(hù)自己的組件炎码。它可以采用由 Android 定義(如 android.Manifest.permission 中所列)或由其他應(yīng)用聲明的任何權(quán)限。它也可以定義自己的權(quán)限秋泳。新權(quán)限用 <permission> 元素來聲明潦闲。例如,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>
請注意迫皱,在此示例中歉闰,DEBIT_ACCT
權(quán)限不僅是通過 <permission> 元素來聲明,而且其使用也是通過 <uses-permission> 元素來請求卓起。要讓應(yīng)用的其他組件也能夠啟動受保護(hù)的 Activity和敬,您必須請求其使用權(quán)限,即便保護(hù)是由應(yīng)用本身施加的亦如此戏阅。
同樣還是在此示例中昼弟,如果將 permission
屬性設(shè)置為在其他位置(例如,android.permission.CALL_EMERGENCY_NUMBERS
)聲明的權(quán)限奕筐,則無需使用 <permission> 元素再次聲明舱痘。但是,仍有必要通過 <uses-permission> 請求其使用權(quán)限离赫。
<permission-tree> 元素聲明為代碼中定義的一組權(quán)限聲明命名空間芭逝,<permission-group> 為一組權(quán)限定義標(biāo)簽,包括在清單中使用<permission>元素聲明的權(quán)限以及在其他位置聲明的權(quán)限渊胸。這只影響如何對提供給用戶的權(quán)限進(jìn)行分組旬盯。<permission-group> 元素并不指定屬于該組的權(quán)限,而只是為組提供名稱蹬刷∑白剑可通過向 <permission> 元素的 permissionGroup 屬性分配組名,將權(quán)限放入組中办成。
庫
每個(gè)應(yīng)用均鏈接到默認(rèn)的 Android 庫泡态,該庫中包括用于開發(fā)應(yīng)用(以及通用類,如 Activity迂卢、服務(wù)某弦、intent桐汤、視圖、按鈕靶壮、應(yīng)用怔毛、ContentProvider)的基本軟件包。
但是腾降,某些軟件包駐留在自己的庫中拣度。如果應(yīng)用使用來自其中任一軟件包的代碼,則必須明確要求其鏈接到這些軟件包螃壤。清單必須包含單獨(dú)的 <uses-library> 元素來命名其中每個(gè)庫抗果。庫名稱可在軟件包的文檔中找到。