AndroidManifest詳解

一,重要性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的節點內實現。有關完整的屬性能夠查看:
<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>
另外:Activity的屬性經常使用的可能爲android:name和android:label兩個,但咱們須要瞭解全部的屬性以幫助解決複雜的問題,完整的以下:android

  • 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節點中用到的定義,能夠看到包含了權限控制、排序方式完整的以下: <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> 而對於服務相關定義以下: <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> 最後是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> 總之,AndroidManifest.xml文件雖然看起來複雜,可是,只要咱們理清中裏面各元素的做用,那麼一切就變得簡單了。

相關文章
相關標籤/搜索