檔案功能
以下章節介紹資訊清單檔是如何反映Android的某些功能的。
Intent過濾器
應用程式的核心組件(Activity、Service、Broadcast Receiver)都是通過Intent對象來啟用的。Intent對象綁定了所期望的操作的資訊說明---包括要操作的資料、執行操作的組件類別、以及其他相關的指令。Android會定位一個合適的組件來響應Intent對象的請求,如果需要它啟動這個組件的一個新的執行個體,並且把Intent對象傳遞給這個執行個體。
組件通過Intent過濾器來公布它們所具有的能力---組件所能響應的Intent對象的類型。因此Android系統在啟動組件之前,必須瞭解組件能夠處理那些Intent對象,Intent過濾器要在資訊清單檔的<intent-filter>元素中指定。
明確命名目標組件的Intent對象,會啟用那個組件,過濾器並不扮演一個角色,但是如果沒有指定目標組件名稱的Intent對象要想啟用一個組件,那麼它必須能夠通過這個組件的一個過濾器來傳遞。
表徵圖和標題
許多元素有icon和label屬性,這兩個屬效能夠聲明顯示給使用者的小表徵圖和文字標籤。還有一些屬性有description屬性,這個屬性值用於在螢幕上顯示一些比較長的解釋性的文本。例如<permission>元素就有這三個屬性,這樣在使用者詢問是否授予應用程式所請求許可權時,就可以用一個icon代表許可權、label代表許可權名稱、description來詳細說明許可權的內容,並把這些資訊展示給使用者。
在任何情況下,在容器型元素中設定的icon和label都會成為它所包含的所有子項目的預設的icon和label設定。這樣,在<application>元素中設定的icon和label屬性值就會成為每個應用程式組件的預設icon和label值。針對一個組件的icon和label設定也會有同樣的效果---例如,一個<activity>元素中設定的icon和label屬性值,會成這個<activity>中每個<intent-filter>元素的預設設定。如果<application>元素設定了一個label屬性,但是<activity>元素以及它的<intent-filter>都沒有設定這個屬性,那麼這個<application>元素的label屬性值會作為<activity>和<intent-filter>元素的label屬性的預設值。
給Intent過濾器設定的icon和label屬性被用於代表一個組件,不管什麼時候,過濾器都會用這兩個屬性來向使用者展示組件所能滿足的功能。例如,帶有android.intent.action.MAIN和android.intent.category.LAUNCHER操作的一個過濾器,會把對應的Activity做應用程式的啟動介面來處理,也就是說,它應該作為Android應用程式啟動器中一個應用程式來顯示,因此這個過濾器中的icon和label的屬性設定應該顯示在Launcher中。
許可權
permission是一種約束,它限制了對裝置上的資料或部分代碼的訪問。施加許可權是為了保護關鍵的資料和代碼不被濫用,防止給使用者帶來不好的使用者體驗。
每種許可權都會有一個唯一的標籤來標識。通常,標籤指明了要約束的操作。例如:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一個功能能夠通過多個許可權來施加保護。
如果應用程式需要訪問一個被許可權保護的功能,那麼它必須在資訊清單檔中用<uses-permission>元素來聲明其要求的許可權。然後,在應用程式被安裝到裝置上時,Android安裝器會通過檢查應用程式的數位憑證,以及詢問使用者,來確定是否要授予應用程式所請求的許可權。如果許可權請求被接受,那麼應用程式就能夠使用被保護的功能,否則,在試圖訪問那些受保護的功能時就會失敗,而且不會給使用者任何提示。
應用程式也可以有保護它自己的組件(Activity、Service、Broadcast Receiver、Content
Provider)。通常可以利用Android系統中定義的許可權(在android.Manifest.permission類中列出的許可權),也可以利用其它應用程式聲明的許可權,還可以定義自己的許可權。用<permission>元素來聲明一個新的許可權。例如,一個Activity可以通過下列方法來保護:
<manifest . . .
>
<permissionandroid:name="com.example.project.DEBIT_ACCT"
. . . />
<uses-permissionandroid:name="com.example.project.DEBIT_ACCT"/>
. . .
<application . . .>
<activityandroid:name="com.example.project.FreneticActivity"
android:permission="com.example.project.DEBIT_ACCT"
. . .
>
. . .
</activity>
</application>
</manifest>
要注意的是,在這個例子中,不僅使用<permission>元素宣告了一個DEBIT_ACCT許可權,而且還用<uses-permission>元素申請了一個DEBIT_ACCT許可權。為了讓應用程式的其他組件能夠啟動這個被保護的Activity,即使這種保護是應用程式自己施加的,也必須要這樣申請。
在同一個例子中,如果permission屬性設定了另外一種許可權(如android:permission.CALL_EMERGENCY_NUMBERS),那麼就沒有必要再用<permission>元素來聲明它了。但是依然有必要使用<uses-permission>元素來進行必要的申請。
<permission-tree>元素為一組在代碼中定義的許可權聲明了一個命名空間,並且<permission-group>元素為這個許可權組定義了一個標籤,這個標籤在向使用者展示許可權時,只會影響到許可權的分組。<permission-group>元素沒有指定哪個許可權屬於該組,它只是給出了一個組名。一個許可權通過比較<permission>元素的permissionGroup屬性值來確定其分組。
外部類庫
每個應用程式都會連結預設的Android類庫,包括構建程式的基本程式包(如,Activity、Service、Intent、View、Button、Application、ContentProvider等等)。
但是,有些包會駐留在它們自己的類庫中,如果應用要使用這些包中的代碼,就必須明確的要求連結這些類庫。對於每個要連結的類庫,資訊清單檔中必須包含單獨的<uses-library>元素。