應(yīng)用清單

應(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)在清單文件中的所有元素,按字母順序列出:

注:這些是僅有的合法元素 – 您無(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、ServiceBroadcastReceiver 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)簽,大量元素具有 iconlabel 屬性。此外,對(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) iconlabel 設(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ù)名稱可在軟件包的文檔中找到。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容