天天看點

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

聲明使用者權限。