檔案約定
某些約定和規則普遍適用於清單中的所有元素和屬性:
元素
只用<manifest>和<application>元素時必須的,而且這兩個元素在檔案中只能出現一次。其他元素則可以多次出現在清單中,或者根本就不出現---但是為了構建一個有意義的清單,必須要在清單中聲明某些元素。
一個元素所包含的任何聲明,包括它所包含的其他元素,所有的值都是通過屬性來設定的,而不是用夾在開閉元素之間的字元資料。
相同層級的元素通常是沒有順序的。例如,<activity>、<provider>、<service>元素可以是任意順序的。(<activity-alias>元素是個例外,它必須放在它所代表的<activity>元素的後面。)
屬性
在正式的含義中,所有的屬性都是可選的,但是,為了達成目的,必須要給元素指定一些屬性。對於真正的可選屬性,會指定發生在特殊情況下的預設值或狀態。
除了<manifest>根項目的一些屬性之外,其他所有屬性的命名都帶有android:首碼---例如,android:alwaysRetainTaskState。因為這個首碼是通用的,所以本文檔在提到屬性名稱時,通常會忽略這個首碼。
聲明類名稱
許多元素都對應著Java對象,包括代表應用程式自己的元素<application>,以及基本的組件---<activity>、<service>、<receiver>、<provider>等。
如果要定義子類,那麼這些子類幾乎總是繼承以下組件類: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字元。