AndroidManifest.xml配置檔案詳解 .

zzy020128發表於2015-05-26


點選(此處)摺疊或開啟

  1. <?xml version=\"1.0\" encoding=\"utf-8\"?>

  2. <manifest>

  3.     <!-- 基本配置 --&gt
  4.     <uses-permission />
  5.     <permission />
  6.     <permission-tree />
  7.     <permission-group />
  8.     <instrumentation />
  9.     <uses-sdk />
  10.     <uses-configuration />
  11.     <uses-feature />
  12.     <supports-screens />
  13.     <compatible-screens />
  14.     <supports-gl-texture />
  15.     
  16.     <!-- 應用配置 --&gt
  17.     <application>
  18.         
  19.         <!-- Activity 配置 --&gt
  20.         <activity>
  21.             <intent-filter>
  22.                 <action />
  23.                 <category />
  24.                 <data />
  25.             </intent-filter>
  26.             <meta-data />
  27.         </activity>
  28.         
  29.         <activity-alias>
  30.             <intent-filter> . . . </intent-filter>
  31.             <meta-data />
  32.         </activity-alias>
  33.         
  34.         <!-- Service 配置 --&gt
  35.         <service>
  36.             <intent-filter> . . . </intent-filter>
  37.             <meta-data/>
  38.         </service>
  39.         
  40.         <!-- Receiver 配置 --&gt
  41.         <receiver>
  42.             <intent-filter> . . . </intent-filter>
  43.             <meta-data />
  44.         </receiver>
  45.         
  46.         <!-- Provider 配置 --&gt
  47.         <provider>
  48.             <grant-uri-permission />
  49.             <meta-data />
  50.         </provider>
  51.         
  52.         <!-- 所需類庫配置 --&gt
  53.         <uses-library />

  54.     </application>

  55. </manifest>


從以上示例程式碼中,我們可以看出Android配置檔案採用XML作為描述語言,每個XML標籤都不同的含義,大部分的配置引數都放在標籤的屬性中,下面我們便按照以上配置檔案樣例中的先後順序來學習Android配置檔案中主要元素與標籤的用法。



AndroidManifest.xml配置檔案的根元素,必須包含一個元素並且指定xlmns:android和package屬性。xlmns:android指定了Android的名稱空間,預設情況下是“http://schemas.android.com/apk/res/android”;而package是標準的應用包名,也是一個應用程式的預設名稱,以本書微博應用例項中的包名為例,即“com.app.demos”就是一個標準的Java應用包名,我們為了避免名稱空間的衝突,一般會以應用的域名來作為包名。當然還有一些其他常用的屬性需要注意一下,比如android:versionCode是給裝置程式識別版本用的,必須是一個整數值代表app更新過多少次;而android:versionName則是給使用者檢視版本用的,需要具備一定的可讀性,比如“1.0.0”這樣的。標籤語法範例如下。


    package="string"
    android:sharedUserId="string"
    android:sharedUserLabel="string resource" 
    android:versionCode="integer"
    android:versionName="string"
    android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
... ...




為了保證Android應用的安全性,應用框架制定了比較嚴格的許可權系統,一個應用必須宣告瞭正確的許可權才可以使用相應的功能,例如我們需要讓應用能夠訪問網路就需要配置“android.permission.INTERNET”,而如果要使用裝置的相機功能,則需要設定“android.permission.CAMERA”等。就是我們最經常使用的許可權設定標籤,我們通過設定android:name屬性來宣告相應的許可權名,比如在微博應用例項中,我們就是根據應用的所需功能宣告瞭對應的許可權,相關程式碼如下。



... ...
    <!-- 網路相關功能 --&gt
   
   
   
   
    <!-- 讀取電話狀態 --&gt
   
    <!-- 通知相關功能 --&gt
   
... ...




許可權宣告標籤,定義了供給使用的具體許可權,通常情況下我們不需要為自己的應用程式宣告某個許可權,除非需要給其他應用程式提供可呼叫的程式碼或者資料,這個時候你才需要使用標籤。該標籤中提供了android:name許可權名標籤,許可權圖示android:icon以及許可權描述android:description等屬性,另外還可以和以及配合使用來構造更有層次的、更有針對性許可權系統。標籤語法範例如下。


    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:permissionGroup="string"
    android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />



用於宣告Instrumentation測試類來監控Android應用的行為並應用到相關的功能測試中,其中比較重要的屬性有:測試功能開關android:functionalTest,profiling除錯功能開關android:handleProfiling,測試用例目標物件android:targetPackage等。另外,我們需要注意的是Instrumentation物件是在應用程式的元件之前被例項化的,這點在組織測試邏輯的時候需要被考慮到。標籤語法範例如下。


    android:handleProfiling=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:targetPackage="string" />



用於指定Android應用中所需要使用的SDK的版本,比如我們的應用必須執行於Android 2.0以上版本的系統SDK之上,那麼就需要指定應用支援最小的SDK版本數為5;當然,每個SDK版本都會有指定的整數值與之對應,比如我們最常用的Android 2.2.x的版本數是8。當然,除了可以指定最低版本之外,標籤還可以指定最高版本和目標版本,語法範例如下。


    android:targetSdkVersion="integer"
    android:maxSdkVersion="integer" />



這兩個標籤都是用於描述應用所需要的硬體和軟體特性,以便防止應用在沒有這些特性的裝置上安裝。標籤中,比如有些裝置帶有D-pad或者Trackball這些特殊硬體,那麼android:reqFiveWayNav屬性就需要設定為true;而如果有一些裝置帶有硬體鍵盤,android:reqHardKeyboard也需要被設定為true。另外,如果裝置需要支援藍芽,我們可以使用來支援這個功能。這兩個標籤主要用於支援一些特殊的裝置中的應用,兩個標籤的語法範例分別如下。


    android:reqHardKeyboard=["true" | "false"]
    android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
    android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
    android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />


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



用於指定Android應用可使用的使用者庫,除了系統自帶的android.app、android.content、android.view和android.widget這些預設類庫之外,有些應用可能還需要一些其他的Java類庫作為支援,這種情況下我們就可以使用標籤讓ClassLoader載入其類庫供Android應用執行時用。標籤的用法很簡單,以下是語法範例。


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

小貼士:
當執行Java程式時,首先執行JVM(Java虛擬機器),然後再把Java類載入到JVM裡頭執行,負責載入Java類的這部分就叫做ClassLoader。當然,ClassLoader是由多個部分構成的,每個部分都負責相應的載入工作。當執行一個程式的時候,JVM啟動,執行BootstrapClassLoader,該ClassLoader載入java核心API(ExtClassLoader和AppClassLoader也在此時被載入),然後呼叫ExtClassLoader載入擴充套件API,最後AppClassLoader載入CLASSPATH目錄下定義的Class,這就是一個Java程式最基本的載入流程。



對於一些應用或者遊戲來說,只能支援某些螢幕大小的裝置或者在某些裝置中的效果比較好,我們就會使用標籤來指定支援的螢幕特徵。其中比較重要的屬性包括:螢幕自適應屬性android:resizeable,小屏(android:smallScreens)、中屏(android:normalScreens)、大屏(android:largeScreens)和特大屏(android:xlargeScreens)支援屬性,按螢幕渲染影像屬性android:anyDensity以及最小螢幕寬度屬性android:requiresSmallestWidthDp等。標籤的語法範例如下。


    android:smallScreens=["true" | "false"]
    android:normalScreens=["true" | "false"]
    android:largeScreens=["true" | "false"]
    android:xlargeScreens=["true" | "false"]
    android:anyDensity=["true" | "false"]
    android:requiresSmallestWidthDp="integer"
    android:compatibleWidthLimitDp="integer"
    android:largestWidthLimitDp="integer"/>



應用配置的根元素,位於下層,包含所有與應用有關配置的元素,其屬性可以作為子元素的預設屬性,常用的屬性包括:應用名android:label,應用圖示android:icon,應用主題android:theme等。當然,標籤還提供了其他豐富的配置屬性,由於篇幅原因就不列舉了,大家可以開啟Android SDK文件來進一步學習,以下是語法範例。


    android:backupAgent="string"
    android:debuggable=["true" | "false"]
    android:description="string resource"
    android:enabled=["true" | "false"]
    android:hasCode=["true" | "false"]
    android:hardwareAccelerated=["true" | "false"]
    android:icon="drawable resource"
    android:killAfterRestore=["true" | "false"]
    android:label="string resource"
    android:logo="drawable 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" >
... ...




Activity活動元件(即介面控制器元件)的宣告標籤,Android應用中的每一個Activity都必須在AndroidManifest.xml配置檔案中宣告,否則系統將不識別也不執行該Activity。標籤中常用的屬性有:Activity對應類名android:name,對應主題android:theme,載入模式android:launchMode(詳見2.1.3.4節),鍵盤互動模式android:windowSoftInputMode等,其他的屬性用法大家可以參考Android SDK文件學習。另外,標籤還可以包含用於訊息過濾的元素,當然還有可用於儲存預定義資料的元素,以下是標籤的語法範例。


    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:hardwareAccelerated=["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元件別名的宣告標籤,簡單來說就是Activity的快捷方式,屬性android:targetActivity表示的就是其相關的Activity名,當然必須是前面已經宣告過的Activity。除此之外,其他比較常見的屬性有:Activity別名名稱android:name,別名開關android:enabled,許可權控制android:permission等。另外,我們還需要注意的是,Activity別名也是一個獨立的Activity,可以擁有自己的元素,其語法範例如下。


    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:permission="string"
    android:targetActivity="string" >
... ...




用於Intent訊息過濾器的宣告,在前面的2.1.3.2節中我們已經對Android應用框架中的Intent訊息作過比較詳細的介紹,我們瞭解到Intent訊息對於Android應用系統來說,是非常重要的“粘合劑”,元素可以放在元素標籤中,來區分可用於處理訊息的Activity控制器、Service服務和廣播接收器Broadcast Receiver。另外,我們還知道Intent訊息還包含有名稱、動作、資料、類別等幾個重要屬性。這點與該標籤的寫法也有一定的關係,比如中必須包含有元素,即用於描述具體訊息的名稱;標籤則用於表示能處理訊息元件的類別,即該Action所符合的類別;而元素則用於描述訊息需要處理的資料格式,我們甚至還可以使用正規表示式來限定資料來源。當然,這些元素和標籤的具體用法我們還需要慢慢學習,下面是標準元素標籤的語法範例。


    android:label="string resource"
    android:priority="integer" >
   
   
   
        android:mimeType="string"
        android:path="string"
        android:pathPattern="string"
        android:pathPrefix="string"
        android:port="string"
        android:scheme="string" />




用於儲存預定義資料,和類似,也可以放在這四個元素標籤中。Meta資料一般會以鍵值對的形式出現,個數沒有限制,而這些資料都將被放到一個Bundle物件中,程式中我們則可以使用ActivityInfo、ServiceInfo甚至ApplicationInfo物件的metaData屬性中讀取。假設我們在一個Activity中定義了一個元素,相關示例用法如下。


   


ActivityInfo info = this.getPackageManager()
    .getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
String testData = info.metaData.getString("testData");
System.out.println("testData:" + testData);



Service服務元件的宣告標籤,用於定義與描述一個具體的Android服務,主要屬性有:Service服務類名android:name,服務圖示android:icon,服務描述android:label以及服務開關android:enabled等。關於Service服務元件的概念和用法請參考2.1.4.2節的內容,以下是標籤的語法範例。


    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:permission="string"
    android:process="string" >
... ...




Boardcast Receiver廣播接收器元件的宣告標籤,用於定義與描述一個具體的Android廣播接收器,其主要屬性和標籤有些類似:Boardcast Receiver接收器類名android:name,接收器圖示android:icon,接收器描述android:label以及接收器開關android:enabled等。關於Boardcast Receiver廣播接收器元件的概念和用法請參考2.1.4.3節的內容,以下是標籤的語法範例。


    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
    android:name="string"
    android:permission="string"
    android:process="string" >
... ...




除Activity、Service和Boardcast Receiver之外的另一個“四大元件”,也就是Content Provider內容提供者的宣告標籤。關於內容提供者元件的概念和用法請參考2.1.4.4節的內容,不再贅述。標籤除了和其他元件相同的android:name、android:icon和android:label等基礎屬性之外,還提供了用於支援其功能的特殊屬性,如:內容提供者標識名稱android:authorities,對指定URI授予許可權標識android:grantUriPermission以及具體的讀、寫許可權,即android:readPermission和android:writePermission等。當然,這些屬性的具體用法我們還需要慢慢學習,以下是標籤的語法範例。


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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/642366/viewspace-1672332/,如需轉載,請註明出處,否則將追究法律責任。

相關文章