每個應用程序在它的根目錄中都必須要有一個AndroidManifest.xml文件。這個清單把應用程序的基本信息提交給Android系統,在應用程序的代碼能夠運行之前,這個信息系統必須建立。以下是清單文件要做的一些事情:
1. 用Java包給應用程序命名。這個包名是應用程序的唯一標識;
2. 描述應用程序的組件---組成應用程序的Activity、Service、Broadcast Receiver以及Content Provider。它要用每個組件的實現類來命名,並向外發布對應組件功能(例如,組件所能處理的Intent消息)。這些聲明會讓Android系統了解應用程序中組件,以及這些組件被加載的條件。
3. 判斷哪些進程是主應用程序組件。
4. 聲明應用程序所必須的權限,以便能夠訪問被保護的API,以及能夠跟其他應用程序進行交互。
5. 為了跟應用程序組件進行交互,還聲明了其他要求有的權限。
6. 列出了能夠提供應用程序運行時的分析和其他信息的Instrumentation類。只有在開發和測試應用程序時才在清單文件中聲明這些類,在應用程序被發布之前,要刪除這些類。
7. 聲明應用程序所要求的最小的Android API級別。
8. 列出應用程序必須鏈接的外部庫。
Manifest文件的結構
下圖中包含了清單文件的一般性結構,並且包含所有能包含的元素。每個元素所帶有的全部元素會在它們各自的文檔中介紹。
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<uses-permission/>
<permission/>
<permission-tree/>
<permission-group/>
<instrumentation/>
<uses-sdk/>
<uses-configuration/>
<uses-feature/>
<supports-screens/>
<compatible-screens/>
<supports-gl-texture/>
<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>
</manifest>
以下按字母順序列出了清單文件中的所有元素,這些元素時Android系統法定元素,不能添加自定義的元素或屬性。
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>
文件約定
某些約定和規則普遍適用於清單中的所有元素和屬性:
元素
只用<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字符。
文件功能
以下章節介紹清單文件是如何反映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>元素。
語法(SYNATX):
<actionandroid:name="string"/>
包含於(CONTAINED IN):
<intent-filter>
說明(DESCRIPTION):
給Intent過濾器添加一個操作。一個<intent-filter>元素必須包含一個或多個<action>元素,如果一個也沒有包含,那么就不會有Intent對象通過過濾器。
屬性(ATTRIBUTES):
android:name
它定義了操作的名稱。在Intent類中用ACTION_string常量定義一些標准的操作。要把這些操作跟這個屬性關聯,就要把前置的ACTION_字符串換成“android.intent.action.”。例如,對於ACTION_MAIN操作,要使用android.intent.action.MAIN來作為屬性值,對於ACTION_WEB_SEARCH操作,要使用android.intent.action.WEB_SEATCH來作為屬性值。
對於自定義的操作,最好使用包名來作為前綴,以確保唯一性。例如,TRANSMOGRIFY操作可以像下例這樣定義:
<actionandroid:name="com.example.project.TRANSMOGRIFY"/>
引入版本(INTRODUCED IN):
API級別 1
語法(SYNATX):
<activityandroid:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale", "uiMode",
"orientation", "screenSize", "smallestScreenSize"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"reverseLandscape" | "reversePortrait" |
"sensorLandscape" | "sensorPortrait" |
"sensor" | "fullSensor" | "nosensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
. . .
</activity>
包含於(CONTAINED IN):
<application>
能夠包含的元素(CAN CONTAIN):
<intent-filter>
<meta-data>
說明(DESCRIPTION):
這個元素聲明了一個Activity(或Activity的子類),Activity實現了應用程序的可視化用戶界面部分。應用程序中所有的Activity都必須在清單文件中用<activity>元素來聲明,沒有在清單文件中聲明的Activity,系統不會看到,也不會運行它。
屬性(ATTRIBUTES):
android:allowTaskReparenting
這個屬性用於設定Activity能夠從啟動它的任務中轉移到另一個與啟動它的任務有親緣關系的任務中,轉移時機是在這個有親緣關系的任務被帶到前台的時候。如果設置了true,則能夠轉移,如果設置了false,則這個Activity必須要保留在啟動它的那個任務中。
如果這個屬性沒有設置,那么其對應的<application>元素的allowTaskReparenting屬性值就會應用到這個Activity上。它的默認值是false。
通常,當Activity被啟動時,它會跟啟動它的任務關聯,並它的整個生命周期都會保持在那個任務中。但是當Activity的當前任務不在顯示時,可以使用這個屬性來強制Activity轉移到與當前任務有親緣關系的任務中。這種情況的典型應用是把應用程序的Activity轉移到與這個應用程序相關聯的主任務中。
例如,如果一個電子郵件消息中包含了一個網頁的鏈接,點擊這個鏈接會啟動一個顯示這個網頁的Activity。但是,由e-mail任務部分啟動的這個Activity是由瀏覽器應用程序定義的。如果把它放到瀏覽器的任務中,那么在瀏覽器下次啟動到前台時,這個網頁會被顯示,並且在e-mail任務再次顯示時,這個Activity有會消失。
Activity的親緣關系是由taskAffinity屬性定義的。通過讀取任務的根Activity的親緣關系來判斷任務的親緣關系。因此,通過定義,任務中的根Activity與任務有着相同的親緣關系。因此帶有singleTask或singleInstance啟動模式的Activity只能是任務的根節點,Activity的任務歸屬受限於standard和singleTop模式。
android:alwaysRetainTaskState
這個屬性用於設置Activity所屬的任務狀態是否始終由系統來維護。如果設置為true,則由系統來維護狀態,設置為false,那么在某些情況下,系統會允許重設任務的初始狀態。默認值是false。這個屬性只對任務根節點的Activity有意義,其他所有的Activity都會被忽略。
通常,在某些情況中,當用戶從主屏中重新啟動一個任務時,系統會先清除任務(從堆棧中刪除根節點Activity之上的所有Activity)。
但是,當這個屬性被設置為true時,用戶會始終返回到這個任務的最后狀態,而不管中間經歷了哪些操作。這樣做是有好處的,例如,Web瀏覽器的應用就會保留很多用戶不想丟失的狀態,如多個被打開的標簽頁。
android:clearTaskOnLaunch
這個屬性用於設定在從主屏中重啟任務時,處理根節點的Activity以外,任務中的其他所有的Activity是否要被刪除。如果設置為true,那么任務根節點的Activity之上的所有Activity都要被清除,如果設置了false,就不會被清除。默認設置時false。這個屬性只對啟動新任務(或根Activity)的那些Activity有意義,任務中其他所有的Activity都會被忽略。
當這個屬性值被設置為true,用戶再次啟動任務時,任務根節點的Activity就會被顯示,而不管在任務的最后做了什么,也不管任務使用Back按鈕,還是使用Home離開的。當這個屬性被設置為false時,在某些情況中這個任務的Activity可以被清除,但不總是這樣的。
例如,假設某人從主屏中啟動了Activity P,並且又從P中啟動了Activity Q。接下來用戶按下了Home按鈕,然后由返回到Activity P。通常用戶會看到Activity Q,因為這是在P的任務中所做的最后的事情。但是,如果P把這個屬性設置為true,那么在用戶按下Home按鈕,任務被掛起時,Activity P之上的所有Activity(本例中是Activity Q)都會被刪除。因此當用戶再次返回到本任務時,用戶只能看到Activity P。
如果這個屬性和allowTaskReparenting屬性都被設置為true,那些被設置了親緣關系的Activity會被轉移到它們共享的親緣任務中,然后把剩下的Activity都給刪除。
url:http://greatverve.cnblogs.com/archive/2012/05/08/AndroidManifest-xml.html
一,重要性
AndroidManifest.xml是Android應用程序中最重要的文件之一。它是Android程序的全局配置文件,是每個android程序中必須的文件。它位於我們開發的應用程序的根目錄下,描述了package中的全局數據,包括package中暴露的組件(activities, services, 等等),以及他們各自的實現類,各種能被處理的數據和啟動位置等重要信息。
因此,該文件提供了Android系統所需要的關於該應用程序的必要信息,即在該應用程序的任何代碼運行之前系統所必須擁有的信息。一個典型的Android應用程序的結構如下圖所示:
二,主要功能
它指定了該應用程序的Java包:該包名作為應用程序的一個獨特標識。
它描述了應用程序組件:該應用程序由哪些activity,service,broadcast receiver和content provider組成。它指定了實現每個組件的類以及公開發布它們的能力(例如,它們能持有哪個Intent信息)。這些聲明使Android系統知道這兒有什么組件以及在什么條件下它們可以被載入。
它決定那些進程將容納應用程序組件。
它聲明了本應用程序必須擁有哪些許可,以便訪問API的被保護部分,以及與其他應用程序交互。
它也聲明了其他應用程序在和該應用程序交互時需要持有的許可。
它列出了Instrumentation類,可以在應用程序運行時提供簡檔和其他信息。這些聲明僅當應用程序在開發和測試過程中被提供;它們將在應用程序正式發布之前被移除。
它聲明了該應用程序所需的Android API的最小化水平。
它列出了該應用程序必須鏈接的庫。
三,主要結構及規則
下面列表顯示了manifest文件的通常的結構以及它可以含有的元素。每個元素,連同它的所有屬性,會在各個單獨的文檔里進行充分的描繪。
<?xml version="1.0" encoding="utf-8"?>
<manifest> //根節點,描述了package中所有的內容
<uses-permission /> //請求你的package正常運作所需賦予的安全許可。一個manifest能包含零個或更多此元素
<permission /> //聲明了安全許可來限制哪些程序能使用你的package中的組件和功能。一個manifest能包含零個或更多此元素
<permission-tree />
<permission-group />
<instrumentation /> //聲明了用來測試此package或其他package指令組件的代碼。一個manifest能包含零個或更多此元素
<uses-sdk /> //指定當前應用程序兼容的最低sdk版本號
<application> //包含package中application級別組件聲明的根節點。此元素也可包含application中全局和默認的屬性,如標簽,icon,主題,必要的權限,等等。一個manifest能包含零個或一個此元素(不允許多余一個)
<activity> //用來與用戶交互的主要工具。當用戶打開一個應用程序的初始頁面時一個activity,大部分被使用到的其他頁面也由不同的activity所實現並聲明在另外的activity標記中。
<intent-filter> //聲明了指定的一組組件支持的Intent值
<action />
<category />
<data />
<type/>
<schema/>
<authority/>
<path/>
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service> //Service是能在后台運行任意時間的組件
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver> //IntentReceiver能使你的application獲得數據的改變或者發生的操作,即使它當前不在運行
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider> //ContentProvider是用來管理持久化數據並發布給其他應用程序使用的組件
<grant-uri-permission />
<meta-data />
</provider>
<uses-library />
<uses-configuration />
</application>
</manifest>
下面是按照字母順序排列的所有可以出現在manifest文件里的元素。它們是唯一合法的元素;你不能加入你自己的元素或屬性。
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<uses-configuration>
<uses-library>
<uses-permission>
<uses-sdk>
說明:AndroidManifest.xml文件的結構、元素,以及元素的屬性,可以在Android SDK文檔中查看詳細說明。而在看這些眾多的元素以及元素的屬性前,需要先了解一下這些元素在命名、結構等方面的規則:
元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出現一次。如果一個元素包含有其他子元素,必須通過子元素的屬性來設置其值。處於同一層次的元素,這些元素的說明是沒有順序的。
屬性:按照常理,所有的屬性都是可選的,但是有些屬性是必須設置的。那些真正可選的屬性,即使不存在,其也有默認的數值項說明。除了根元素<manifest>的屬性,所有其他元素屬性的名字都是以android:前綴的;
定義類名:所有的元素名都對應其在SDK中的類名,如果你自己定義類名,必須包含類的數據包名,如果類與application處於同一數據包中,可以直接簡寫為“.”;
多數值項:如果某個元素有超過一個數值,這個元素必須通過重復的方式來說明其某個屬性具有多個數值項,且不能將多個數值項一次性說明在一個屬性中;
資源項說明:當需要引用某個資源時,其采用如下格式:@[package:]type:name。例如 <activity android:icon=”@drawable/icon ” . . . >
字符串值:類似於其他語言,如果字符中包含有字符“\”,則必須使用轉義字符“\\”;
四,詳細說明
值得一提一些常用之處:
1,幾乎所有的AndroidManifest.xml(以及許多其他Android的xml的文件)在第一個元素中包含了命名空間的聲明xmlns:android="http://schemas.android.com/apk/res/android"。這樣使得Android中各種標准屬性能在文件中使用,提供了大部分元素中的數據。
2,大部分manifests包含了單個<application>的元素,它定義了所有的application級別組件和屬性,並能在package中使用。
3,任何被用戶看作頂層應用程序,並能被程序啟動器所用的package,需要包含至少一個Activity組件來支持MAIN操作和LAUNCHER種類。動作android.intent.action.MAIN指示這是應用程序的入口點。類別android.intent.category.LAUNCHER將此Activity放在啟動器窗口中。
在最外層的<manifest>中包含了包名如 package="cn.androidlover.demo" 、軟件的版本號 android:versionCode="1" 以及 android:versionName="1.0"的屬性,而里面一層的<application>分支中將可能包含Android程序的四種對象 Activity、Service、Content Provider以及Receiver。我們每添加上面四個類型中的任一種新對象都需要在androidmanifest.xml文件中添加相應節點,否則運行時將會產生異常。每一個activity必須要一個<activity>標記對應,無論它給外部使用或是只用於自己的package中。如果一個activity沒有對應的標記,你將不能運行它。
此文件一個重要的地方就是它所包含的intent-filters。這些filters描述了activity啟動的位置和時間。每當一個activity(或者操作系統)要執行一個操作,例如:打開網頁或聯系簿時,它創建出一個intent的對象。它能承載一些信息描述了你想做什么,你想處理什么數據,數據的類型,和一些其他信息。Android比較了intent對象中和每個application所暴露的intent-filter中的信息,來找到最合適的activity來處理調用者所指定的數據和操作。關於intent的更多信息請訪問Intent參考頁面。
application屬性介紹:
有關AndroidManifest.xml文件的application分支我們有必要了解一些常見的屬性,這里可以看到一些我們實用的選項,比如允許調試android:debuggable、任務關系android:taskAffinity,比如我們常見的方式創建一個新的任務實用標記FLAG_ACTIVITY_NEW_TASK,為程序制定一個主題,可以使用android:theme指向一個主題文件。平時我們創建的程序使用一些安全敏感項,會需要請求系統許可權限,這里可以使用android:permission來制定相關的許可,每個程序的service、activity、content provider、receiver都需要在application的節點內實現。有關完整的屬性可以查看:
1 <application android:allowClearUserData=["true" | "false"]
2 android:allowTaskReparenting=["true" | "false"]
3 android:debuggable=["true" | "false"]
4 android:description="string resource"
5 android:enabled=["true" | "false"]
6 android:hasCode=["true" | "false"]
7 android:icon="drawable resource"
8 android:label="string resource"
9 android:manageSpaceActivity="string"
10 android:name="string"
11 android:permission="string"
12 android:persistent=["true" | "false"]
13 android:process="string"
14 android:taskAffinity="string"
15 android:theme="resource or theme" >
16 . . .
17 </application>
另外:Activity的屬性常用的可能為android:name和android:label兩個,但我們需要了解所有的屬性以幫助解決復雜的問題,完整的如下:
- android:allowTaskReparenting=["true" | "false"]
- android:alwaysRetainTaskState=["true" | "false"]
- android:clearTaskOnLaunch=["true"" | "false"]
- android:configChanges=[one or more of: "mcc" "mnc" "locale" "touchscreen" "keyboard" "keyboardHidden" "navigation" "orientation" "fontScale"]
- android:enabled=["true" | "false"]
- android:excludeFromRecents=["true" | "false"]
- android:exported=["true" | "false"]
- android:finishOnTaskLaunch=["true" | "false"]
- android:icon="drawable resource"
- android:label="string resource"
- android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"]
- android:multiprocess=["true" | "false"]
- android:name="string"
- android:noHistory=["true" | "false"]
- android:permission="string"
- android:process="string"
- android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nonsensor"]
- android:stateNotNeeded=["true" | "false"]
- android:taskAffinity="string"
- android:theme="resource or theme"
- android:windowSoftInputMode=[one or more of: "stateUnspecified" "stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible" "stateAlwaysVisible" "adjustUnspecified" "adjustResize" "adjustPan"]
從Provider節點中用到的定義,可以看到包含了權限控制、排序方式完整的如下:
1 <provider android:authorities="list"
2 android:enabled=["true" | "false"]
3 android:exported=["true" | "false"]
4 android:grantUriPermissions=["true" | "false"]
5 android:icon="drawable resource"
6 android:initOrder="integer"
7 android:label="string resource"
8 android:multiprocess=["true" | "false"]
9 android:name="string"
10 android:permission="string"
11 android:process="string"
12 android:readPermission="string"
13 android:syncable=["true" | "false"]
14 android:writePermission="string" >
15 </provider>
而對於服務相關定義如下:
1 <service android:enabled=["true" | "false"]
2 android:exported[="true" | "false"]
3 android:icon="drawable resource"
4 android:label="string resource"
5 android:name="string"
6 android:permission="string"
7 android:process="string" >
8 </service>
最后是Broadcast使用的Receiver定義,一般配合和隱式處理。
1 <receiver android:enabled=["true" | "false"]
2 android:exported=["true" | "false"]
3 android:icon="drawable resource"
4 android:label="string resource"
5 android:name="string"
6 android:permission="string"
7 android:process="string" >
8 </receiver>
總之,AndroidManifest.xml文件雖然看起來復雜,但是,只要我們理清中里面各元素的作用,那么一切就變得簡單了。
《完》