1. 程式人生 > >AndroidManifest.xml檔案詳解(二)

AndroidManifest.xml檔案詳解(二)

檔案約定

某些約定和規則普遍適用於清單中的所有元素和屬性:

元素

只用<manifest><application>元素時必須的,而且這兩個元素在檔案中只能出現一次。其他元素則可以多次出現在清單中,或者根本就不出現---但是為了構建一個有意義的清單,必須要在清單中宣告某些元素。

一個元素所包含的任何宣告,包括它所包含的其他元素,所有的值都是通過屬性來設定的,而不是用夾在開閉元素之間的字元資料。

相同級別的元素通常是沒有順序的。例如,<activity><provider><service>元素可以是任意順序的。(<activity-alias>

元素是個例外,它必須放在它所代表的<activity>元素的後面。)

屬性

在正式的含義中,所有的屬性都是可選的,但是,為了達成目的,必須要給元素指定一些屬性。對於真正的可選屬性,會指定發生在特殊情況下的預設值或狀態。

除了<manifest>根元素的一些屬性之外,其他所有屬性的命名都帶有android:字首---例如,android:alwaysRetainTaskState。因為這個字首是通用的,所以本文件在提到屬性名時,通常會忽略這個字首。

宣告類名稱

許多元素都對應著Java物件,包括代表應用程式自己的元素<application>,以及基本的元件---<activity>

<service><receiver><provider>等。

如果要定義子類,那麼這些子類幾乎總是繼承以下元件類:ActivityServiceBroadcastReceiverContentProvider。子類是通過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字元。