AndroidManifest.xml檔案詳解(二)
檔案約定
某些約定和規則普遍適用於清單中的所有元素和屬性:
元素
只用<manifest>和<application>元素時必須的,而且這兩個元素在檔案中只能出現一次。其他元素則可以多次出現在清單中,或者根本就不出現---但是為了構建一個有意義的清單,必須要在清單中宣告某些元素。
一個元素所包含的任何宣告,包括它所包含的其他元素,所有的值都是通過屬性來設定的,而不是用夾在開閉元素之間的字元資料。
相同級別的元素通常是沒有順序的。例如,<activity>、<provider>、<service>元素可以是任意順序的。(<activity-alias>
屬性
在正式的含義中,所有的屬性都是可選的,但是,為了達成目的,必須要給元素指定一些屬性。對於真正的可選屬性,會指定發生在特殊情況下的預設值或狀態。
除了<manifest>根元素的一些屬性之外,其他所有屬性的命名都帶有android:字首---例如,android:alwaysRetainTaskState。因為這個字首是通用的,所以本文件在提到屬性名時,通常會忽略這個字首。
宣告類名稱
許多元素都對應著Java物件,包括代表應用程式自己的元素<application>,以及基本的元件---<activity>
如果要定義子類,那麼這些子類幾乎總是繼承以下元件類:Activity、Service、BroadcastReceiver、ContentProvider。子類是通過name屬性來宣告的。這個名稱必須是完整Java包名。例如,下例演示了Service子類的宣告方法:
<manifest . . .
><application . . .
><service
android:name="com.example.project.SecretService" . . .
>
. . .
</service>
. . .
</application></manifest>
但是,也可以使用簡略的表達方式,用”.”符號做為name屬性值的第一個字元。在Android系統解析是會在”.”符號前追加包名(包名是在<manifest>元素的package屬性中宣告的)。下例的宣告方法與上例的結果相同:
<manifest
package="com.example.project" . . .
><application . . .
><service
android:name=".SecretService" . . .
>
. . .
</service>
. . .
</application></manifest>
在啟動元件時,Android會建立這個命名子類的一個例項物件。如果沒有指定子類,那麼就會建立一個基類的例項物件。
多個值的設定
如果要給一個元素指定多個值,那麼幾乎總是重複使用這個元素,而不是在一個元素中列出多個值。如:
<intent-filter . . .
><actionandroid:name="android.intent.action.EDIT"/><actionandroid:name="android.intent.action.INSERT"/><actionandroid:name="android.intent.action.DELETE"/>
. . .
</intent-filter>
資源值的設定
有一些屬性值是能夠顯示給使用者的---例如,Activity的標題和圖示。這些屬性值應該被本地化,並因此要設定在資源或主題中。資源值是用下列格式來表示的:@[package:]type:name
如果資源與應用在同一個包中,那麼package的名稱可以被忽略,type是資源的型別---如“string”或“drawable”,name是標識指定資源的名稱。例如:
<activity android:icon="@drawable/smallPic" . . . >
來自主題的值是用類似的方式來表示的,但是要以‘?’開始,而不是‘@’:
?[package:]type:name
String值的設定
當屬性值是一個字串是,‘\\’符號要用於字元轉義---如‘\\n’表示在此處換行,‘\\uxxxx’表示‘xxxx’是Unicode字元。