注:本文轉載於:http://blog.csdn.net/xianming01/article/details/7526987html
AndroidManifest.xml文件解析。前端
一、重要性java
AndroidManifest.xml是Android應用程序中最重要的文件之一。它是Android程序的全局配置文件,是每一個 android程序中必須的文件。它位於咱們開發的應用程序的根目錄下,描述了package中的全局數據,包括package中暴露的組件 (activities, services, 等等),以及他們各自的實現類,各類能被處理的數據和啓動位置等重要信息。
所以,該文件提供了Android系統所須要的關於該應用程序的必要信息,即在該應用程序的任何代碼運行以前系統所必須擁有的信息。一個典型的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中全部的內容
- <original-package />//original-package應該是通知PackageManager作替換
- <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>
- <original-package>
- <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 」 . . . >
字符串值:相似於其餘語言,若是字符中包含有字符「\」,則必須使用轉義字符「\\」;
四、詳細說明
值得一提一些經常使用之處:
一、幾乎全部的AndroidManifest.xml(以及許多其餘Android的xml的文件)在第一個元素中包含了命名空間的聲明 xmlns:android="http://schemas.android.com/apk/res/android"。這樣使得Android中各 種標準屬性能在文件中使用,提供了大部分元素中的數據。
二、大部分manifests包含了單個<application>的元素,它定義了全部的application級別組件和屬性,並能在package中使用。
三、任何被用戶看做頂層應用程序,並能被程序啓動器所用的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參考頁面。
4.1 Manifest屬性介紹
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.woody.test"
- android:sharedUserId="string"
- android:sharedUserLabel="string resource"
- android:versionCode="integer"
- android:versionName="string"
- android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
- </manifest>
A、xmlns:android
定義android命名空間,通常爲http://schemas.android.com/apk/res/android,這樣使得Android中各類標準屬性能在文件中使用,提供了大部分元素中的數據。
B、package
指定本應用內java主程序包的包名,它也是一個應用進程的默認名稱
C、sharedUserId
代表數據權限,由於默認狀況下,Android給每一個APK分配一個惟一的UserID,因此是默認禁止不一樣APK訪問共享數據的。若要共享數據,第一能夠採用Share Preference方法,第二種就能夠採用sharedUserId了,將不一樣APK的sharedUserId都設爲同樣,則這些APK之間就能夠互相共享數據了。詳見:http://wallage.blog.163.com/blog/static/17389624201011010539408/
D、sharedUserLabel
一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義
E、versionCode
是給設備程序識別版本(升級)用的必須是一個interger值表明app更新過多少次,好比初版通常爲1,以後若要更新版本就設置爲2,3等等。
F、versionName
這個名稱是給用戶看的,你能夠將你的APP版本號設置爲1.1版,後續更新版本設置爲1.二、2.0版本等等。。。
G、installLocation
安裝參數,是Android2.2中的一個新特性,installLocation有三個值能夠選擇:internalOnly、auto、preferExternal
選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(固然最終用戶能夠選擇爲內部ROM存儲上,若是SD存儲已滿,也會安裝到內部存儲上)
選擇auto,系統將會根據存儲空間本身去適應
選擇internalOnly是指必須安裝到內部才能運行
(注:須要進行後臺類監控的APP最好安裝在內部,而一些較大的遊戲APP最好安裝在SD卡上。現默認爲安裝在內部,若是把APP安裝在SD卡上,首先得設置你的level爲8,而且要配置android:installLocation這個參數的屬性爲preferExternal)
4.2 application屬性介紹
有關AndroidManifest.xml文件的application分支咱們有必要了解一些常見的屬性,這裏能夠看到一些咱們實用的選項,好比容許 調試android:debuggable、任務關係android:taskAffinity,好比咱們常見的方式建立一個新的任務實用標記 FLAG_ACTIVITY_NEW_TASK,爲程序制定一個主題,可使用android:theme指向一個主題文件。平時咱們建立的程序使用一些 安全敏感項,會須要請求系統許可權限,這裏可使用android:permission來制定相關的許可,每一個程序的service、 activity、content provider、receiver都須要在application的節點內實現。有關完整的屬性能夠查看:
- <application android:allowClearUserData=["true" | "false"]
- android:allowTaskReparenting=["true" | "false"]
- android:debuggable=["true" | "false"]
- android:description="string resource"
- android:enabled=["true" | "false"]
- android:hasCode=["true" | "false"]
- android:icon="drawable resource"
- android:label="string resource"
- android:manageSpaceActivity="string"
- android:name="string"
- android:permission="string"
- android:persistent=["true" | "false"]
- android:process="string"
- android:taskAffinity="string"
- android:theme="resource or theme" >
- . . .
- </application>
A、android:allowClearUserData('true' or 'false')
用戶是否能選擇自行清除數據,默認爲true,程序管理器包含一個選擇容許用戶清除數據。當爲true時,用戶可本身清理用戶數據,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否容許activity更換從屬的任務,好比從短信息任務切換到瀏覽器任務
C、android:backupAgent
這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並無默認值,而且類名必須得指定(就是個備份工具,將數據備份到雲端的操做)
D、android:debuggable
這個從字面上就能夠看出是什麼做用的,當設置爲true時,代表該APP在手機上能夠被調試。默認爲false,在false的狀況下調試該APP,就會報如下錯誤:
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
E、android:description/android:label
此兩個屬性都是爲許可提供的,均爲字符串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字符串資源就能夠顯示給用戶。label應當儘可能簡短,之須要告知用戶該許但是在保護什麼功能就行。而description能夠用於具體描述獲取該許可的程序能夠作哪些事情,實際上讓用戶能夠知道若是他們贊成程序獲取該權限的話,該程序能夠作什麼。咱們一般用兩句話來描述許可,第一句描述該許可,第二句警告用戶若是批准該權限會可能有什麼很差的事情發生
F、android:enabled
Android系統是否可以實例化該應用程序的組件,若是爲true,每一個組件的enabled屬性決定那個組件是否能夠被 enabled。若是爲false,它覆蓋組件指定的值;全部組件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代碼,默認爲true,若爲false,則系統在運行組件時,不會去嘗試加載任何的APP代碼
一個應用程序自身不會含有任何的代碼,除非內置組件類,好比Activity類,此類使用了AliasActivity類,固然這是個罕見的現象
(在Android2.3能夠用標準C來開發應用程序,可在androidManifest.xml中將此屬性設置爲false,由於這個APP自己已經不含有任何的JAVA代碼了)
H、android:icon
這個很簡單,就是聲明整個APP的圖標,圖片通常都放在drawable文件夾下
I、android:killAfterRestore
J、android:manageSpaceActivity
K、android:name
爲應用程序所實現的Application子類的全名。當應用程序進程開始時,該類在全部應用程序組件以前被實例化。
若該類(比方androidMain類)是在聲明的package下,則能夠直接聲明android:name="androidMain",但此類是在package下面的子包的話,就必須聲明爲全路徑或android:name="package名稱.子包名成.androidMain"
L、android:permission
設置許可名,這個屬性若在<application>上定義的話,是一個給應用程序的全部組件設置許可的便捷方式,固然它是被各組件設置的許可名所覆蓋的
M、android:presistent
該應用程序是否應該在任什麼時候候都保持運行狀態,默認爲false。由於應用程序一般不該該設置本標識,持續模式僅僅應該設置給某些系統應用程序纔是有意義的。
N、android:process
應用程序運行的進程名,它的默認值爲<manifest>元素裏設置的包名,固然每一個組件均可以經過設置該屬性來覆蓋默認值。若是你想兩個應用程序共用一個進程的話,你能夠設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候
O、android:restoreAnyVersion
一樣也是android2.2的一個新特性,用來代表應用是否準備嘗試恢復全部的備份,甚至該備份是比當前設備上更要新的版本,默認是false
P、android:taskAffinity
擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是<manifest>元素中設定的package名
Q、android:theme
是一個資源的風格,它定義了一個默認的主題風格給全部的activity,固然也能夠在本身的theme裏面去設置它,有點相似style。
4.3 Activity屬性介紹
另外: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"]
(注:有些在application中重複的就很少闡述了)
一、android:alwaysRetainTaskState
是否保留狀態不變, 好比切換回home, 再重新打開,activity處於最後的狀態。好比一個瀏覽器擁有不少狀態(當打開了多個TAB的時候),用戶並不但願丟失這些狀態時,此時可將此屬性設置爲true
二、android:clearTaskOnLaunch
好比 P 是 activity, Q 是被P 觸發的 activity, 而後返回Home, 從新啓動 P,是否顯示 Q
三、android:configChanges
當配置list發生修改時, 是否調用 onConfigurationChanged() 方法 好比 "locale|navigation|orientation".
這個我用過,主要用來看手機方向改變的. android手機在旋轉後,layout會從新佈局, 如何作到呢?
正常狀況下. 若是手機旋轉了.當前Activity後殺掉,而後根據方向從新加載這個Activity. 就會從onCreate開始從新加載.
若是你設置了 這個選項, 當手機旋轉後,當前Activity以後調用onConfigurationChanged() 方法. 而不跑onCreate方法等.
四、android:excludeFromRecents
是否可被顯示在最近打開的activity列表裏,默認是false
五、android:finishOnTaskLaunch
當用戶從新啓動這個任務的時候,是否關閉已打開的activity,默認是false
若是這個屬性和allowTaskReparenting都是true,這個屬性就是王牌。Activity的親和力將被忽略。該Activity已經被摧毀並不是re-parented
六、android:launchMode(Activity加載模式)
在多Activity開發中,有多是本身應用之間的Activity跳轉,或者夾帶其餘應用的可複用Activity。可能會但願跳轉到原來某個Activity實例,而不是產生大量重複的Activity。這須要爲Activity配置特定的加載模式,而不是使用默認的加載模式
Activity有四種加載模式:
standard、singleTop、singleTask、singleInstance(其中前兩個是一組、後兩個是一組),默認爲standard
- standard:就是intent將發送給新的實例,因此每次跳轉都會生成新的activity。
- singleTop:也是發送新的實例,但不一樣standard的一點是,在請求的Activity正好位於棧頂時(配置成singleTop的Activity),不會構造新的實例
- singleTask:和後面的singleInstance都只建立一個實例,當intent到來,須要建立設置爲singleTask的Activity的時候,系統會檢查棧裏面是否已經有該Activity的實例。若是有直接將intent發送給它。
- singleInstance:
首先說明一下task這個概念,Task能夠認爲是一個棧,可放入多個Activity。好比啓動一個應用,那麼Android就建立了一個Task,而後啓動這個應用的入口Activity,那在它的界面上調用其餘的Activity也只是在這個task裏面。那若是在多個task中共享一個Activity的話怎麼辦呢。舉個例來講,若是開啓一個導遊服務類的應用程序,裏面有個Activity是開啓GOOGLE地圖的,當按下home鍵退回到主菜單又啓動GOOGLE地圖的應用時,顯示的就是剛纔的地圖,其實是同一個Activity,實際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨放入一個棧中,這樣這個棧中只有這一個Activity,不一樣應用的intent都由這個Activity接收和展現,這樣就作到了共享。固然前提是這些應用都沒有被銷燬,因此剛纔是按下的HOME鍵,若是按下了返回鍵,則無效
七、android:multiprocess
是否容許多進程,默認是false
具體可看該篇文章:http://www.bangchui.org/simple/?t3181.html
八、android:noHistory
當用戶從Activity上離開而且它在屏幕上再也不可見時,Activity是否從Activity stack中清除並結束。默認是false。Activity不會留下歷史痕跡
九、android:screenOrientation
activity顯示的模式
- 默認爲unspecified:由系統自動判斷顯示方向
- landscape橫屏模式,寬度比高度大
- portrait豎屏模式, 高度比寬度大
- user模式,用戶當前首選的方向
- behind模式:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
- sensor模式:有物理的感應器來決定。若是用戶旋轉設備這屏幕會橫豎屏切換
- nosensor模式:忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了
十、android:stateNotNeeded
activity被銷燬或者成功重啓時是否保存狀態
十一、android:windowSoftInputMode
activity主窗口與軟鍵盤的交互模式,能夠用來避免輸入法面板遮擋問題,Android1.5後的一個新特性。
這個屬性能影響兩件事情:
【A】當有焦點產生時,軟鍵盤是隱藏仍是顯示
【B】是否減小活動主窗口大小以便騰出空間放軟鍵盤
各值的含義:
【A】stateUnspecified:軟鍵盤的狀態並無指定,系統將選擇一個合適的狀態或依賴於主題的設置
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裏的狀態,不管是隱藏仍是顯示
【C】stateHidden:用戶選擇activity時,軟鍵盤老是被隱藏
【D】stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也老是被隱藏的
【E】stateVisible:軟鍵盤一般是可見的
【F】stateAlwaysVisible:用戶選擇activity時,軟鍵盤老是顯示的狀態
【G】adjustUnspecified:默認設置,一般由系統自行決定是隱藏仍是顯示
【H】adjustResize:該Activity老是調整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分
4.4 Provider屬性介紹
從Provider節點中用到的定義,能夠看到包含了權限控制、排序方式完整的以下:
- <provider android:authorities="list"
- android:enabled=["true" | "false"]
- android:exported=["true" | "false"]
- android:grantUriPermissions=["true" | "false"]
- android:icon="drawable resource"
- android:initOrder="integer"
- android:label="string resource"
- android:multiprocess=["true" | "false"]
- android:name="string"
- android:permission="string"
- android:process="string"
- android:readPermission="string"
- android:syncable=["true" | "false"]
- android:writePermission="string" >
- </provider>
contentProvider(數據存儲)
【1】android:authorities:
標識這個ContentProvider,調用者能夠根據這個標識來找到它
【2】android:grantUriPermission:
對某個URI授予的權限
【3】android:initOrder
4.5 service屬性介紹
【1】service與activity同級,與activity不一樣的是,它不能本身啓動的,運行在後臺的程序,若是咱們退出應用時,Service進程並無結束,它仍然在後臺運行。好比聽音樂,網絡下載數據等,都是由service運行的
【2】service生命週期:Service只繼承了onCreate(),onStart(),onDestroy()三個方法,第一次啓動Service時,前後調用了onCreate(),onStart()這兩個方法,當中止Service時,則執行onDestroy()方法,若是Service已經啓動了,當咱們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法
【3】service與activity間的通訊
Service後端的數據最終仍是要呈如今前端Activity之上的,由於啓動Service時,系統會從新開啓一個新的進程,這就涉及到不一樣進程間通訊的問題了(AIDL),Activity與service間的通訊主要用IBinder負責。具體可參照:http://zhangyan1158.blog.51cto.com/2487362/491358
【4】
而對於服務相關定義以下:
- <service android:enabled=["true" | "false"]
- android:exported[="true" | "false"]
- android:icon="drawable resource"
- android:label="string resource"
- android:name="string"
- android:permission="string"
- android:process="string" >
- </service>
service標籤內的屬性以前已有描述,在此不重複了~
4.6Receiver屬性介紹
最後是Broadcast使用的Receiver定義,通常配合和隱式處理。
- <receiver android:enabled=["true" | "false"]
- android:exported=["true" | "false"]
- android:icon="drawable resource"
- android:label="string resource"
- android:name="string"
- android:permission="string"
- android:process="string" >
- </receiver>
receiver的屬性與service同樣,這裏就不顯示了
BroadcastReceiver:用於發送廣播,broadcast是在應用程序之間傳輸信息的一種機制,而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件,具體參照http://kevin2562.javaeye.com/blog/686787
4.7 intent-filter屬性介紹
結構圖:
- <intent-filter android:icon="drawable resource"
- android:label="string resource"
- android:priority="integer" >
- <action />
- <category />
- <data />
- </intent-filter>
android:priority(解釋:有序廣播主要是按照聲明的優先級別,如A的級別高於B,那麼,廣播先傳給A,再傳給B。優先級別就是用設置priority屬性來肯定,範圍是從-1000~1000,數越大優先級別越高)
Intent filter內會設定的資料包括action,data與category三種。也就是說filter只會與intent裏的這三種資料做對比動做
action很簡單,只有android:name這個屬性。常見的android:name值爲android.intent.action.MAIN,代表此activity是做爲應用程序的入口。有關android:name具體有哪些值,可參照這個網址:http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html
category也只有android:name屬性。常見的android:name值爲android.intent.category.LAUNCHER(決定應用程序是否顯示在程序列表裏)
有關android:name具體有哪些值,可參照這個網址:http://chroya.javaeye.com/blog/685871
data屬性
- <data android:host="string"
- android:mimeType="string"
- android:path="string"
- android:pathPattern="string"
- android:pathPrefix="string"
- android:port="string"
- android:scheme="string"/>
【1】每一個<data>元素指定一個URI和數據類型(MIME類型)。它有四個屬性scheme、host、port、path對應於URI的每一個部分:
scheme://host:port/path
scheme的值通常爲"http",host爲包名,port爲端口號,path爲具體地址。如:http://com.test.project:200/folder/etc
其中host和port合起來構成URI的憑據(authority),若是host沒有指定,則port也會被忽略
要讓authority有意義,scheme也必需要指定。要讓path有意義,scheme+authority也必需要指定
【2】mimeType(指定數據類型),若mimeType爲'Image',則會從content Provider的指定地址中獲取image類型的數據。還有'video'啥的,若設置爲video/mp4,則表示在指定地址中獲取mp4格式的video文件
【3】而pathPattern和PathPrefix主要是爲了格式化path所使用的
- <meta-data android:name="string"
- android:resource="resource specification"
- android:value="string"/>
這是該元素的基本結構.能夠包含在<activity> <activity-alias> <service> <receiver>四個元素中。
android:name(解釋:元數據項的名字,爲了保證這個名字是惟一的,採用java風格的命名規範,如com.woody.project.fried)
android:resource(解釋:資源的一個引用,指定給這個項的值是該資源的id。該id能夠經過方法Bundle.getInt()來從meta-data中找到。)
android:value(解釋:指定給這一項的值。能夠做爲值來指定的數據類型而且組件用來找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean])
通常的值能夠經過value屬性來指定,可是若是要指定一個資源id做爲一個值,那麼就要用resource屬性來代替。例如:下面的代碼就是指定存儲在@string/kangaroo 資源中的zoo名字。
- meta-data android:name="zoo" android:value="@string/kangaroo" />
另外一方面,利用resource屬性將指定zoo的資源id號,並非存儲在資源中的資源值。
- <meta-data android:name="zoo" android:resource="@string/kangaroo" />
讀取這些數據,可使用以下小程序:
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-
- package="com.example.readmetadata"
-
- android:versionCode="1"
-
- android:versionName="1.0">
-
- <application android:icon="@drawable/icon" android:label="@string/app_name">
-
- <activity android:name=".MainMenu" android:label="@string/app_name">
-
- <intent-filter>
-
- <action android:name="android.intent.action.MAIN" />
-
- <category android:name="android.intent.category.LAUNCHER" />
-
- </intent-filter>
-
- </activity>
-
- <meta-data android:name="my_api_key" android:value="mykey123" />
-
- </application>
-
- <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />
-
- </manifest>
讀取程序以下:
- try {
-
- ApplicationInfo ai = getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);
-
- Bundle bundle = ai.metaData;
-
- String myApiKey = bundle.getString("my_api_key");
-
- } catch (NameNotFoundException e) {
-
- Log.e(TAG, "Failed to load meta-data, NameNotFound: " + e.getMessage());
-
- } catch (NullPointerException e) {
-
- Log.e(TAG, "Failed to load meta-data, NullPointer: " + e.getMessage());
-
- }
4.8 activity-alias屬性介紹
- <activity-alias android:enabled=["true" | "false"]
- android:exported=["true" | "false"]
- android:icon="drawable resource"
- android:label="string resource"
- android:name="string"
- android:permission="string"
- android:targetActivity="string">
- <intent-filter/>
- <meta-data/>
- </activity-alias>
<activity-alias>是爲activity建立快捷方式的,以下實例:
- <activity android:name=".shortcut">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- <activity-alias android:name=".CreateShortcuts" android:targetActivity=".shortcut" android:label="@string/shortcut">
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity-alias>
其中android.targetActivity是指向對應快捷方式的activity,如上述的shortcut(此Activity名)
android:label是指快捷方式的名稱,而快捷方式的圖標默認是給定的application圖標
4.9 uses-library屬性介紹
用戶庫,可自定義。全部android的包均可以引用
4.10 supports-screens屬性介紹
- <supports-screens android:smallScreens=["true" | "false"]
- android:normalScreens=["true" | "false"]
- android:largeScreens=["true" | "false"]
- android:anyDensity=["true" | "false"] />
這是在android1.6之後的新特性,支持多屏幕機制
各屬性含義:這四個屬性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多種不一樣密度
4.11 uses-configuration與uses-feature屬性介紹
- <uses-configuration android:reqFiveWayNav=["true" | "false"]
- android:reqHardKeyboard=["true" | "false"]
- android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
- android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
- android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />
- <uses-feature android:glEsVersion="integer"
- android:name="string"
- android:required=["true" | "false"] />
這二者都是在描述應用所須要的硬件和軟件特性,以便防止應用在沒有這些特性的設備上安裝。
4.12 uses-sdk屬性介紹
- <uses-sdk android:minSdkVersion="integer"
- android:targetSdkVersion="integer"
- android:maxSdkVersion="integer"/>
描述應用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3
在此屬性中能夠指定支持的最小版本,目標版本以及最大版本
4.13 instrumentation屬性介紹
- <instrumentation android:functionalTest=["true" | "false"]
- android:handleProfiling=["true" | "false"]
- android:icon="drawable resource"
- android:label="string resource"
- android:name="string"
- android:targetPackage="string"/>
定義一些用於探測和分析應用性能等等相關的類,能夠監控程序。在各個應用程序的組件以前instrumentation類被實例化
android:functionalTest(解釋:instrumentation類是否能運行一個功能測試,默認爲false)
4.14 permission 屬性介紹
最經常使用的當屬<uses-permission>,當咱們須要獲取某個權限的時候就必須在咱們的manifest文件中聲明,此<uses-permission>與<application>同級,具體權限列表請看此處
一般狀況下咱們不須要爲本身的應用程序聲明某個權限,除非你提供了供其餘應用程序調用的代碼或者數據。這個時候你才須要使用<permission> 這個標籤。很顯然這個標籤可讓咱們聲明本身的權限。好比:
<permission android:name="com.teleca.project.MY_SECURITY" . . . />
那麼在activity中就能夠聲明該自定義權限了,如:
<application . . .>
<activity android:name="XXX" . . . >
android:permission="com.teleca.project.MY_SECURITY"> </activity>
</application>
固然本身聲明的permission也不能隨意的使用,仍是須要使用<uses-permission>來聲明你須要該權限
<permission-group> 就是聲明一個標籤,該標籤表明了一組permissions,而<permission-tree>是爲一組permissions聲明瞭一個namespace。
4.15 original-package
舉個例子,在Google主題Launcher2的AndroidManifest.xml中:
- <manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.launcher"
- android:sharedUserId="@string/sharedUserId"
- >
- <original-package android:name="com.android.launcher2" />
這裏package="com.android.launcher",產生的R.java就會在com.android.launcher中
<original-package android:name="com.android.launcher2" /> 這個地方表示,源碼包是com.android.launcher2。因此在代碼中引用的R.java必須是import com.android.launcher.R;
總之,AndroidManifest.xml文件雖然看起來複雜,可是,只要咱們理清中裏面各元素的做用,那麼一切就變得簡單了。
參考文獻:
Android學習筆記之AndroidManifest.xml文件解析後端