Android Manifest文件詳解

Android項目中的Manifest.xml文件是Android應用的入口文件,用來聲明權限配置,四大組件,Intent等。

結構圖

<?xmlversion="1.0"encoding="utf-8"?>
<manifest>
    <uses-sdk/> 
    <uses-configuration/> 
    <uses-feature/>  

    <uses-permission/>
    <permission/>
    <permission-tree/>
    <permission-group/>
    <instrumentation/> 

    <supports-screens/>

    <application> 

       <activity> 
           <intent-filter>
               <action/> 
               <category/> 
           </intent-filter> 
      </activity>

       <activity-alias> 
           <intent-filter></intent-filter> 
           <meta-data/> 

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

Manifest:屬性

<manifest  xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.finddreams.csdn"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource"
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
  • xmlns:定義了android的命名空間,一般爲http://schemas.andorid.com/apk/res/android,這樣使Android中各種標準屬性能在文件中使用,提供了大部分元素中的數據。
  • packge:指定本應用內Java主程序包的包名,他也是一個應用進程的默認名稱。
  • sharedUserId:表明數據權限,因爲默認情況下,Android給每個APK分配一個唯一的userID,所以是默認禁止不同的APK訪問共享數據的,若要共享數據,可以採用sharedUserId,將不同的APKsharedUserId都設爲一樣的,則這些APK之間就可以共享數據了,參考見: http://blog.csdn.net/jiangwei0910410003/article/details/51316688
  • sharedUserLabel:一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義。
  • versionCode:是給設備程序識別版本(升級)用的。必須是一個Integer值。
  • versionName:這個名稱是給用戶看的。例如1.1.1,
  • installLocation:安裝參數,是Android2.2中的一個新特性,installLocation有三個值可以選擇:
    • preferExternal:,系統會優先考慮將APK安裝到SD卡上(當然最終用戶可以選擇爲內部ROM存儲上,如果SD存儲已滿,也會安裝到內部存儲上)
    • auto:系統將會根據存儲空間自己去適應
    • internalOnly:是指必須安裝到內部才能運行

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>
  • android:name:應用程序中繼承Application的子類的全名。當應用程序進程開始時,該類在所有應用程序組件之前被實例化。
  • android:label:APP名稱
  • android:icon:APP圖標
  • android:theme:APP的主題資源。@style/AppTheme
  • android:description:APP描述
    (下面是一些不常用屬性)
  • android:enabled:Android系統是否能夠實例化該應用程序的組件,如果爲true,每個組件的enabled屬性決定那個組件是否可以被 enabled。如果爲false,它覆蓋組件指定的值;所有組件都是disabled。
  • android:allowClearUserData:用戶是否能選擇自行清除數據,默認爲true,程序管理器包含一個選擇允許用戶清除數據。當爲true時,用戶可自己清理用戶數據,反之亦然
  • android:allowTaskReparenting:是否允許activity更換從屬的任務,比如從短信息任務切換到瀏覽器任務
  • android:backupAgent:這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並沒有默認值,並且類名必須得指定(就是個備份工具,將數據備份到雲端的操作)
  • 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.
  • android:supportsRtl:這個是爲了做地區適配的,RTL即從右向左佈局,Android4.2支持原生RTL,有些語言,例如阿拉伯語,它的閱讀習慣是從左向右的,爲了優雅的更改佈局方向,直接在application中設置android:supportsRtl=”true”即可。
  • android:largeHeap:讓應用能申請使用更多的內存,我們知道安卓系統對於每個應用都有內存使用的限制,機器的內存限制,
  • android:permission:設置許可名,這個屬性若在上定義的話,是一個給應用程序的所有組件設置許可的便捷方式,當然它是被各組件設置的許可名所覆蓋的
  • android:presistent:該應用程序是否應該在任何時候都保持運行狀態,默認爲false。因爲應用程序通常不應該設置本標識,持續模式僅僅應該設置給某些系統應用程序纔是有意義的。
  • android:process:應用程序運行的進程名,它的默認值爲元素裏設置的包名,當然每個組件都可以通過設置該屬性來覆蓋默認值。如果你想兩個應用程序共用一個進程的話,你可以設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候
    -android:restoreAnyVersion同樣也是android2.2的一個新特性,用來表明應用是否準備嘗試恢復所有的備份,甚至該備份是比當前設備上更要新的版本,默認是false
    -android:taskAffinity擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是元素中設定的package名

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>
  • android:alwaysRetainTaskState:是否保留狀態不變, 比如切換回home, 再重新打開,activity處於最後的狀態。比如一個瀏覽器擁有很多狀態(當打開了多個TAB的時候),用戶並不希望丟失這些狀態時,此時可將此屬性設置爲true
  • android:clearTaskOnLaunch :比如 P是 activity, Q是被P觸發的 activity, 然後返回Home, 重新啓動P,是否顯示Q
  • android:configChanges:當配置清單發生修改時, 是否調用 onConfigurationChanged() 方法 比如 “locale|navigation|orientation”。主要用來看手機方向改變的. android手機在旋轉後,layout會重新佈局, 正常情況下. 如果手機旋轉了.當前Activity後殺掉,然後根據方向重新加載這個Activity. 就會從onCreate開始重新加載,如果你設置了 這個選項, 當手機旋轉後,當前Activity之後調用onConfigurationChanged() 方法. 而不跑onCreate方法等.
  • android:excludeFromRecents:是否可被顯示在最近打開的activity列表裏,默認是false
  • android:finishOnTaskLaunch:當用戶重新啓動這個任務的時候,是否先關閉已打開的activity,默認是false
  • android:launchMode:Activity啓動模式,【standard、singleTop、singleTask、singleInstance】默認爲standard;詳情請百度。
  • android:multiprocess:是否允許多進程,默認是false
  • android:noHistory:當用戶從Activity上離開並且它在屏幕上不再可見時,Activity是否從Activity stack中清除並結束。默認是false。Activity不會留下歷史痕跡
  • android:stateNotNeeded:activity被銷燬或者成功重啓時是否保存狀態
  • android:screenOrientation:activity顯示的模式,

    • unspecified 由系統自動判斷顯示方向
    • landscape 橫屏模式,寬度比高度大
    • portrait 豎屏模式, 高度比寬度大
    • user模式,用戶當前首選的方向
    • behind模式:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
    • sensor模式:有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換
    • nosensor模式:忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了

    android:windowSoftInputMode:activity主窗口與軟鍵盤的交互模式,可以用來避免輸入法面板遮擋問題,Android1.5後的一個新特性。

    • stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設置
    • stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裏的狀態,無論是隱藏還是顯示
    • stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
    • stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
    • stateVisible:軟鍵盤通常是可見的
    • stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態
    • adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
    • adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間
    • adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分

intent-filter: 屬性

<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string"/>
  • android:name(解釋:元數據項的名字,爲了保證這個名字是唯一的,採用java風格的命名規範,如com.woody.project.fried)
  • android:resource(解釋:資源的一個引用,指定給這個項的值是該資源的id。該id可以通過方法Bundle.getInt()來從meta-data中找到。)
  • android:value(解釋:指定給這一項的值。可以作爲值來指定的數據類型並且組件用來找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getLong],[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創建快捷方式的,如下實例:

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

  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負責。
<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標籤內的屬性之前已有描述,在此不重複了。

Receiver

四大組件之一,廣播,屬性與service一樣。

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

contentProvider內容提供者,四大組件之一。

  1. android:authorities:列出一個或者多個由content provider的提供的URI的authorities。多個authorities由分號隔開。爲了避免衝突,authority的命名規則應該遵循java的編碼慣例(例如使用com.example.provider.cartoonprovider作爲authority),通常情況authority的名字就是實現了provider的一個子類的名稱。authority沒有默認值,必須顯式的指定
  2. android:enabled:該屬性表明了該content provider是否可以被實例化。默認爲true
  3. android:exported:該屬性指示了content provider是否可以被其他應用程序使用。
  4. android:grantUriPermissions:該屬性用於標識哪些沒有數據訪問權限的應用程式是否可以訪問該數據。當該值爲true時,並且有其他應用訪問該content provider提供的數據是,依據readPermission 和writePermission中的規則給出限制。默認爲false
  5. android:icon:設置content provider的圖標資源。如果沒有設置,則默認爲< application>的圖標
  6. android:initOrder:對於處在同一進程中的不同content provider來說,該屬性值代表了不同content provider之間的初始化順序。當不同的content provider之間有相互依賴時,設置該屬性之後,可以確保相互依賴的content provider被按照一定的順序創建。該屬性的值爲整數,並且數值越大優先級越高
  7. android:label:代表可讀的content provider標籤。如果該屬性尚未設置,則默認爲< application>的label標籤。該屬性的值爲字符串,因此該屬性同樣也是可以參照不同的語言環境來進行切換的。但是爲了方便開發,該屬性通常被設置爲一個常量的不可變的字符串
  8. android:multiprocess:該content provider 是否可以被任意一個進程實例化(默認值爲false)
  9. android:name:該屬性代表實現了content provider的類的名稱,也就是ContentProvider的子類。該屬性應該是一個類的全名稱(例如:com.example.project.TransportationProvider)。但是當我們在< manifest>中指定了完整的包名。此時也可以使用.TransportationProvider來代替。 該屬性沒有默認值,必須指定
  10. android:permission:讀寫該content provider數據的權限的名稱。這個屬性很方便的規定了讀和寫兩種權限。但是readPermission和writePermission的優先級要高於該屬性的優先級。如果readPermission 設置的值,用於控制查詢content provider的數據;writePermission設置的值,用於控制修改content provider的數據。
  11. android:process該content provide應該運行在哪個進程中。通常情況下application的所有組件都運行在一個由application創建的默認認的進程中。content provider的該屬性值和application的相同。< application> 標籤中的process屬性可以左右其所有子組件的默認值,但是每個子組件同樣是可以覆蓋< application> 標籤的該屬性的。進而允許你的應用跨進程通信。如果這個分配的名稱以冒號:開始,那麼當它需要運行在哪個進程的時候,一個新的,私有的進程就被創建。如果這個進程名稱以小寫字母開始,那麼這個provider將運行在全局進程中。這就允許這個進程在不同的應用中共享,進而降低對資源的消耗。
  12. android:readPermission:客戶端讀取content provider數據所需的權限。
  13. android:syncable:content provider的數據是否要和服務數據進行同步,若同步則爲true,否則爲false。
  14. android:writePermission:客戶端修改由content provider控制的數據時所需的權限。

uses-library

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

supports-screens

<supports-screens  android:smallScreens=["true" | "false"] 
                  android:normalScreens=["true" | "false"] 
                  android:largeScreens=["true" | "false"] 
                  android:anyDensity=["true" | "false"] />

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

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

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

uses-sdk

<uses-sdk android:minSdkVersion="integer"
          android:targetSdkVersion="integer"
          android:maxSdkVersion="integer"/>

描述應用所需的api level,就是版本。在此屬性中可以指定支持的最小版本,目標版本以及最大版本

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)

permission

聲明用戶權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章