天天看點

Android Manifest.xml檔案解析

一、關于androidmanifest.xml

androidmanifest.xml是每個android程式中必須的檔案。它位于整個項目的根目錄,描述了package中暴露的元件(activities, services, 等等),他們各自的實作類,各種能被處理的資料和啟動位置。除了能聲明程式中的activities, contentproviders, services, 和intent receivers,還能指定permissions和instrumentation(安全控制和測試)

二、androidmanifest.xml結構

<?xmlversion="1.0"encoding="utf-8"?>

<manifest>

   <application>

      <activity>

          <intent-filter>

              <action/>

              <category/>

          </intent-filter>

     </activity>

      <activity-alias>

          <intent-filter></intent-filter>

          <meta-data/>

     </activity-alias>

      <service>

      </service>

      <receiver>

      </receiver>

      <provider>

          <grant-uri-permission/>

      </provider>

      <uses-library/>

   </application>

   <uses-permission/>

   <permission/>

   <permission-tree/>

   <permission-group/>

   <instrumentation/>

   <uses-sdk/>

   <uses-configuration/> 

   <uses-feature/> 

   <supports-screens/>

</manifest>

三、各個節點的詳細介紹

 上面就是整個am(androidmanifest).xml的結構,下面以外向内開始闡述~~

1、第一層(<manifest>):(屬性)

         package="com.woody.test"

         android:shareduserid="string"

         android:shareduserlabel="string resource"

         android:versioncode="integer"

         android:versionname="string"

         android:installlocation=["auto" | "internalonly" |"preferexternal"] >

a、xmlns:android

b、package

指定本應用内java主程式包的包名,它也是一個應用程序的預設名稱

c、shareduserid

d、shareduserlabel

一個共享的使用者名,它隻有在設定了shareduserid屬性的前提下才會有意義

e、versioncode

是給裝置程式識别版本(更新)用的必須是一個interger值代表app更新過多少次,比如第一版一般為1,之後若要更新版本就設定為2,3等等。。。

f、versionname

這個名稱是給使用者看的,你可以将你的app版本号設定為1.1版,後續更新版本設定為1.2、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)

2、第二層(<application>):屬性

一個androidmanifest.xml中必須含有一個application标簽,這個标簽聲明了每一個應用程式的元件及其屬性(如icon,label,permission等)

<application android:allowclearuserdata=["true" | "false"]

             android:allowtaskreparenting=["true"| "false"]

            android:backupagent="string"

            android:debuggable=["true" | "false"]

            android:description="string resource"

            android:enabled=["true" | "false"]

             android:hascode=["true"| "false"]

            android:icon="drawable resource"

            android:killafterrestore=["true" | "false"]

            android:label="string resource"

            android:managespaceactivity="string"

            android:name="string"

            android:permission="string"

            android:persistent=["true" | "false"]

            android:process="string"

            android:restoreanyversion=["true" | "false"]

            android:taskaffinity="string"

             android:theme="resourceor 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 xxxrequires that applications explicitely declare themselves as debuggable intheir manifest.

 applicationxxx does not have the attribute 'debuggable' set to true in its manifest andcannot 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。

3、第三層(<activity>):屬性

<activityandroid:allowtaskreparenting=["true" | "false"]

         android:alwaysretaintaskstate=["true" | "false"]

         android:cleartaskonlaunch=["true" | "false"]

         android:configchanges=["mcc", "mnc", "locale",

                                "touchscreen", "keyboard", "keyboardhidden",

                                "navigation", "orientation", "screenlayout",

                                "fontscale", "uimode"]

          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" | "nosensor"]

         android:statenotneeded=["true" | "false"]

         android:taskaffinity="string"

         android:theme="resource or theme"

         android:windowsoftinputmode=["stateunspecified",

                                      "stateunchanged", "statehidden",

                                      "statealwayshidden", "statevisible",

                                      "statealwaysvisible", "adjustunspecified",

                                      "adjustresize", "adjustpan"] >   

</activity>

(注:有些在application中重複的就不多闡述了)

1、android:alwaysretaintaskstate

 是否保留狀态不變, 比如切換回home, 再從新打開,activity處于最後的狀态。比如一個浏覽器擁有很多狀态(當打開了多個tab的時候),使用者并不希望丢失這些狀态時,此時可将此屬性設定為true

2、android:cleartaskonlaunch 

比如 p 是 activity, q 是被p 觸發的 activity, 然後傳回home, 重新啟動 p,是否顯示 q

3、android:configchanges

當配置list發生修改時, 是否調用onconfigurationchanged() 方法  比如 "locale|navigation|orientation". 

這個我用過,主要用來看手機方向改變的. android手機在旋轉後,layout會重新布局, 如何做到呢?

正常情況下. 如果手機旋轉了.目前activity後殺掉,然後根據方向重新加載這個activity. 就會從oncreate開始重新加載.

如果你設定了 這個選項, 當手機旋轉後,目前activity之後調用onconfigurationchanged()方法. 而不跑oncreate方法等.

4、android:excludefromrecents

是否可被顯示在最近打開的activity清單裡,預設是false

5、android:finishontasklaunch

當使用者重新啟動這個任務的時候,是否關閉已打開的activity,預設是false

如果這個屬性和allowtaskreparenting都是true,這個屬性就是王牌。activity的親和力将被忽略。該activity已經被摧毀并非re-parented

6、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鍵,如果按下了傳回鍵,則無效

7、android:multiprocess

是否允許多程序,預設是false

8、android:nohistory

當使用者從activity上離開并且它在螢幕上不再可見時,activity是否從activity stack中清除并結束。預設是false。activity不會留下曆史痕迹

9、android:screenorientation

activity顯示的模式

預設為unspecified:由系統自動判斷顯示方向

landscape橫屏模式,寬度比高度大

portrait豎屏模式, 高度比寬度大

user模式,使用者目前首選的方向

behind模式:和該activity下面的那個activity的方向一緻(在activity堆棧中的)

sensor模式:有實體的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換

nosensor模式:忽略實體感應器,這樣就不會随着使用者旋轉裝置而更改了

10、android:statenotneeded

activity被銷毀或者成功重新開機時是否儲存狀态

11、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、第四層(<intent-filter>)

結構圖:

<intent-filter android:icon="drawable resource"

              android:label="string resource"

              android:priority="integer" >

     <action />

     <category />

     <data />

</intent-filter> 

intent-filter屬性

android:priority(解釋:有序廣播主要是按照聲明的優先級别,如a的級别高于b,那麼,廣播先傳給a,再傳給b。優先級别就是用設定priority屬性來确定,範圍是從-1000~1000,數越大優先級别越高)

intent filter内會設定的資料包括action,data與category三種。也就是說filter隻會與intent裡的這三種資料作對比動作

action屬性

category屬性

category也隻有android:name屬性。常見的android:name值為android.intent.category.launcher(決定應用程式是否顯示在程式清單裡)

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

其中host和port合起來構成uri的憑據(authority),如果host沒有指定,則port也會被忽略

要讓authority有意義,scheme也必須要指定。要讓path有意義,scheme+authority也必須要指定

【2】mimetype(指定資料類型),若mimetype為'image',則會從contentprovider的指定位址中擷取image類型的資料。還有'video'啥的,若設定為video/mp4,則表示在指定位址中擷取mp4格式的video檔案

【3】而pathpattern和pathprefix主要是為了格式化path所使用的

5、第四層<meta-data>

<meta-dataandroid: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])

6、第三層<activity-alias>屬性

<activity-aliasandroid: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-aliasandroid: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圖示

7、第三層<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間的通信

【4】

<serviceandroid: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标簽内的屬性之前已有描述,在此不重複了~

8、第三層<receiver>

receiver的屬性與service一樣,這裡就不顯示了

9、第三層<provider>屬性

<providerandroid:authorities="list"

         android:enabled=["true" | "false"]

         android:granturipermissions=["true" | "false"]

         android:initorder="integer"

         android:readpermission="string"

         android:syncable=["true" | "false"]

         android:writepermission="string">

</provider>

contentprovider(資料存儲)

【1】android:authorities:

辨別這個contentprovider,調用者可以根據這個辨別來找到它

【2】android:granturipermission:

對某個uri授予的權限

【3】android:initorder

10、第三層<uses-library>

使用者庫,可自定義。所有android的包都可以引用

11、第一層<supports-screens>

<supports-screens android:smallscreens=["true" | "false"] 

                 android:normalscreens=["true" | "false"] 

                 android:largescreens=["true" | "false"] 

                 android:anydensity=["true" | "false"] />

這是在android1.6以後的新特性,支援多螢幕機制

各屬性含義:這四個屬性,是否支援大屏,是否支援中屏,是否支援小屏,是否支援多種不同密度

12、第二層<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-featureandroid:glesversion="integer"

             android:name="string"

             android:required=["true" | "false"] />

這兩者都是在描述應用所需要的硬體和軟體特性,以便防止應用在沒有這些特性的裝置上安裝。

13、第二層<uses-sdk />

<uses-sdkandroid:minsdkversion="integer"

         android:targetsdkversion="integer"

         android:maxsdkversion="integer"/>

描述應用所需的api level,就是版本,目前是android2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3

在此屬性中可以指定支援的最小版本,目标版本以及最大版本

14、第二層<instrumentation/>

<instrumentationandroid: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)

15、<permission>、<uses-permission>、<permission-tree/>、<permission-group />差別~

最常用的當屬<uses-permission>,當我們需要擷取某個權限的時候就必須在我們的manifest檔案中聲明,此<uses-permission>與<application>同級,具體權限清單請看此處

通常情況下我們不需要為自己的應用程式聲明某個權限,除非你提供了供其他應用程式調用的代碼或者資料。這個時候你才需要使用<permission> 這個标簽。很顯然這個标簽可以讓我們聲明自己的權限。比如:

<permissionandroid: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。這兩個标簽可以看之前的系列文章。

轉載自:http://www.cnblogs.com/pilang/archive/2011/04/20/2022932.html

繼續閱讀