AndroidManifest.xml文件解讀

1、關於AndroidManifest.xml 前端

AndroidManifest.xml 是每一個android程序中必須的文件。它位於整個項目的根目錄,描述了package中暴露的組件(activities, services, 等等),他們各自的實現類,各類能被處理的數據和啓動位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)。 java

2、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>
           <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>
    <uses-permission/>
    <permission/>
    <permission-tree/>
    <permission-group/>
    <instrumentation/>
    <uses-sdk/>
    <uses-configuration/> 
    <uses-feature/> 
    <supports-screens/>
</manifest>

 3、各個節點的詳細介紹 android

一、第一層(<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主程序包的包名,它也是一個應用進程的默認名稱 api

C、sharedUserId
代表數據權限,由於默認狀況下,Android給每一個APK分配一個惟一的UserID,因此是默認禁止不一樣APK訪問共享數據的。若要共享數據,第一能夠採用Share Preference方法,第二種就能夠採用sharedUserId了,將不一樣APK的sharedUserId都設爲同樣,則這些APK之間就能夠互相共享數據了。 瀏覽器

D、sharedUserLabel
一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義 安全

E、versionCode
是給設備程序識別版本(升級)用的必須是一個interger值表明app更新過多少次,好比初版通常爲1,以後若要更新版本就設置爲2,3等等。。。 網絡

F、versionName
這個名稱是給用戶看的,你能夠將你的APP版本號設置爲1.1版,後續更新版本設置爲1.二、2.0版本等等。。。 app

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) ide

二、第二層(<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="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,就會報錯誤

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。

三、第三層(<Activity>):屬性
<activity android: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中重複的就很少闡述了)
 
一、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
 
八、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:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分

四、第四層(<intent-filter>)

  • 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屬性
<action android:name="string" />

action很簡單,只有android:name這個屬性。常見的android:name值爲android.intent.action.MAIN,代表此activity是做爲應用程序的入口。 

  • category屬性
<category android:name="string" />

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

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>

<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])

六、第三層<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圖標

七、第三層<service>

<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>

【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負責。

八、第三層<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>

BroadcastReceiver:用於發送廣播,broadcast是在應用程序之間傳輸信息的一種機制,而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件

九、第三層<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">
        <grant-uri-permission/>
        <meta-data/>
</provider>

contentProvider(數據存儲)

【1】android:authorities:標識這個ContentProvider,調用者能夠根據這個標識來找到它

【2】android:grantUriPermission:對某個URI授予的權限

【3】android:initOrder

十、第三層<uses-library>

<uses-library />

用戶庫,可自定義。全部android的包均可以引用

十一、第一層<supports-screens>
<supports-screens  android:smallScreens=["true" | "false"] 
                  android:normalScreens=["true" | "false"] 
                  android:largeScreens=["true" | "false"] 
                  android:anyDensity=["true" | "false"] />

這是在android1.6之後的新特性,支持多屏幕機制

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

十二、第二層<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"] />

這二者都是在描述應用所須要的硬件和軟件特性,以便防止應用在沒有這些特性的設備上安裝。

1三、第二層<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

在此屬性中能夠指定支持的最小版本,目標版本以及最大版本

1四、第二層<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)

1五、<permission>、<uses-permission>、<permission-tree />、<permission-group />區別

最經常使用的當屬<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。這兩個標籤能夠看以前的系列文章。

相關文章
相關標籤/搜索