原文鏈接:http://android.eoe.cn/topic/android_sdk
每一個應用程序在工程的根目錄下必須要有一個AndroidManifest.xml文件(一定要用這個名稱)。這個清單文件向安卓系統提供關於該應用的重要信息,這些信息在它運行任何應用代碼之前是必須要有的。除了其他方面,清單文件執行以下操作:
:* 它列出了應用程序的包名。這個包名充當這個應用程序的唯一的標識符。
:* 它描述了這個應用程序的組件 :活動、服務、廣播接收者和內容提供者。它列舉了每一個組件的級別和這些組件所具有的能力(例如,它們能操作哪一類意圖)。這些聲明讓安卓系統知道這些組件具體是哪個及在什麼樣的條件下它們能被啓動。
:* 它決定了哪個進程將會使用這些應用組件。
:* 它聲明瞭應用程序一定要有的權限,如果打算訪問API受保護的部分或者與其他程序進行交互。
:* 它也聲明瞭其他應用程序需要訪問這個應用程序組件的權限。
:* 它列出了Instrumentation類,這個類提供了程序運行時候的性能分析和其他信息。這些聲明要存在於清單中,僅當這個應用程序正在被開發和測試,在發佈應用程序之前應該將它們移除掉。
:* 它聲明瞭這個應用程序的最小的Android API級別。
:* 它列出了這個應用程序一定會被鏈接到的庫。
清單文件的結構
:下圖展示了清單的通用結構和它能包含的每一元素。每一元素與它們的屬性一起被記錄在一個單獨的文件中。爲了觀察到每一元素的詳細信息,點擊圖中每一元素的名字,跟隨下圖中的字母列表元素,或者其他任何提及到的元素名。
<?xml version"utf-8"?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <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 /> </provider> <uses-library /> </application> |
:所有這些元素可能出現在清單文件的,按照字母順序全被列出在下面。這些是唯一合法的元素,你不能添加你自己元素或屬性。
:[http://docs.eoeandroid.com/guide/topics/manifest/permission-tree-element.html]
:
:
文件約定
清單中普遍適用於所有的元素和屬性的一些約定和規則。
- 元素* :在所有的元素中,只有和元素是必需的。它們一定要在清單文件中存在且只能出現一次。其他大多數可以出現多次或者不出現-儘管它們至少有一些一定要在清單中存在來完成一些有意義的事。
:如果一個元素包含任何東西,它當然也能包含其他元素。所有的值都是通過設置屬性,而不是僅將字符數據放在一個元素中。
:同一等級的元素通常都是無序的。例如、 和元素能以任意順序混雜在一起。(元素是這一規則的一個特例:它必須跟在該別名所指的之後。)
- 屬性* :從正式的意義上來說,所有的屬性都是可選擇的。然而,有些屬性必須爲元素指定其要完成的目標。把這篇文檔作爲指南。對於真正可選的屬性,即使沒指定它會發生什麼,也會有一個默認的值或者狀態。
:除了元素中的一些屬性,所有的屬性名字都是以android:作爲前綴。例如android:alwaysRetainTaskState.因爲這個前綴是通用的,當提及到屬性名時,這篇文檔通常省略它。
- 聲明類名* :許多對應於java對象的元素,包括應用程序的元素本身(元素)和它的重要組件——活動(),服務(),廣播接收者()和內容提供者().
:如果你定義一個子類,跟組件類(Activity,Service,BroadcastReceiver,和ContentProvider)一樣,這個子類通過一個name的屬性來聲明。這個名字必須包含完整的包名。例如,一個Service子類可能會被像下面聲明:
:然而,爲了簡寫,如果字符串的第一個字符是一個點號“.”,這個字符串被附加到這個應用程序的包名上(例如通過元素的package屬性指定)。下面的寫法跟上面一個一樣的.
:當啓動一個組件時,安卓會創建這個被命令的子類的實例。如果沒有指定子類,它會創建一個基類的實例。
- 多重值* :如果要指定元素的不只一個值,這個元素總是被重複聲明。而不是在單一的元素屬性中列出多個值。例如:一個意圖濾波器會列出多個動作。 . . .
- 資源值* :一些屬性有一些可以展示給用戶看的值-----例如,活動的一個標籤和圖標。這些屬性的值應該被本地化的,從一個資源或主題設置。資源值的表現形式如下:
::@[package:]type:name
:如果資源在同一個應用的同一個包中,包名可以被省略。type是資源的類型----例如"string"或者"drawable"。name是用來標識特定資源名。例如:
:一個主題的值的也是以一個類似的方式來表示,但是是以?開頭而不是以@。
::?[package:]type:name
- 字符串值* :當一個屬性值是字符串時,一定要用兩個反斜槓('\')表示''這個轉義字符。例如:"\n"表示換行或"\uxxxx"表示Unicode字符。
* 文件特性*
以下幾段描述一些安卓特性是如何反映在清單文件上。
意圖濾波器
應用程序的核心組件(活動,服務,廣播接收者)通過Intents被激活。一個意圖是一捆的信息(一個Intent對象),這些信息描述了一個請求動作——包括有用的數據,用來執行動作的組件的類別,和其他相關的指令。安卓找到一個合適的組件來響應這個意圖,啓動一個新的組件實例,如果需要的話,並傳遞這個意圖對象。
組件公佈它們的能力--各種各樣的它們能響應的意圖--通過意圖濾波器。由於安卓系統在啓動一個組件之前必須瞭解這個組件能操作哪種意圖,意圖濾波器要在清單中的中被指定。一個組件可能有許多濾波器,每一個都描述一種不同的能力。
一個意圖顯式的命名一個目標組件將會激活那個組件;這時濾波器不扮演任何角色。(濾波器無效)。
但是一個意圖不指明目標時,只有通過一個組件的濾波器時,才能激活這個組件。
關於一個意圖對象怎樣通過意圖濾波器的測試,查看單獨的文檔:Intents and Intent Filters
圖標和標籤
許多元素都有icon和label屬性,這些屬性是爲了向用戶展示一個小的圖標或者一個文本標籤。一些也有一個description 屬性,這個屬性是爲了在屏幕上能顯示一些長的說明文本。例如元素有這三個屬性,所以當用戶被問及請求的應用程序是否授權,一個表示權限的圖標,權限的名稱,和一個描述它的細節都會被呈現給用戶。
在任何情況下,設置在一個包含元素裏的圖標和標籤會成爲該容器所有子元素的缺省設置。因此元素裏的圖標和標籤是每一個應用程序組件的缺省圖標和標籤。同樣地,爲一個組件設置的圖標和標籤——例如元素——是這個組件的元素的缺省設置。如果一個元素設置一個標籤,但是一個活動和它的意圖濾波器沒有設置,這個應用程序的標籤被當作是這個活動和意圖濾波器的標籤。
這個意圖濾波器的圖標和標籤集被用來表示一個組件,無論何時這個組件通過一個濾波器來爲用戶實現這個功能。例如,一個帶有"android.intent.action.MAIM"和"android.intent.category.LAUNCHER"設置的活動將會啓動一個應用----那就是,作爲一個應該在啓動欄中被顯示的應用。濾波器中的這個圖標和標籤集因此也會在啓動欄中被顯示。
權限
權限是一種約束。限制對部分代碼或者設備的數據的訪問。這種限制用於保護關鍵數據和代碼,這些東西有可能會被濫用
進而扭曲和損害用戶的體驗。
每一個權限被唯一的標籤所標識。通常標籤聲明約束的動作。例如,這裏有一些安卓系統定義的權限:
:android.permission.CALL_EMERGENCY_NUMBERS
:android.permission.READ_OWNER_DATA
:android.permission.SET_WALLPAPER
:android.permission.DEVICE_POWER
一個特性可以被至多一個權限所保護。
如果一個應用程序需要訪問一個受保護的特性,它必須在清單中用元素聲明,以表明它需要這個權限。這樣,當這個程序被安裝到設備上時,安裝器決定是否授予請求的權限,通過檢測相關權限,這些權限被應用程序的認證書所證明。在一些情況下,會詢問用戶。如果權限被授予,這個應用程序將有能力去訪問這些受保護的特性。否則,它將嘗試去訪問那些特性,將會失敗用不會給用戶任何通知。
應用程序也能用權限來保護它自己的組件(活動,服務,廣播接收者和內容提供者)。它可以使用安卓所定義的任何權限(在android.Manifest.permission列出來了)或者通過其他應用來聲明。或者自己定義。一個新的權限通過元素來聲明。例如,一個活動可以用下面方式保護:
注意,在這個例子中,DEBIT_ACCT權限不僅僅被元素聲明,它還需要在元素中聲明。爲了應用程序的其他組件可以啓動這個受保護的活動,必須請求它的權限,即使這個保護是應用程序自己引入的。
同一個例子中,如果permission屬性已經在別處聲明瞭(例如android.permission.CALL_EMERGENCY_NUMBERS),那麼不必再次在元素中聲明它。但還要在來聲明。
元素爲將被定義在代碼中的一組權限聲明一個命令空間。
聲明爲一組權限(用聲明的那些或者在別處聲明的那些)定義一個標籤。它隻影響權限怎樣分組,當展示給用戶的時候元素並不指定哪個權限屬於這一組;它僅僅給這個組一個名字。一個權限要被放入這一組中,是通過分配這一組的名字給元素的permissionGroup屬性。
庫
每一個應用程序被鏈接到默認的安卓庫,這個庫包含創建應用程序的基本包(有公共類如:活動,服務,意圖,視圖,按鈕,應用,內容提供者等等)。
然而,一些包擁有它自己的庫。如果你的應用程序使用這些包中的代碼,則必須顯式地聲明來鏈接它們。這時清單一定要包含一個獨立的元素來標記每一個庫(這個庫名能在包中的文件中找到。)