咱們在進行APP開發的時候都會遇到一個文件:AndroidManifest.xml。從剛開始進行Android開發,到如今已通過去了幾個月,仍是對這個文件只知其一;不知其二,只知道它是配置用的。可是這文件裏的東西具體有什麼用,該怎麼用一直都沒有理解。藉着作項目的機會,仔細研究一下這個文件。java
研究AndroidManifest.xml最好的方式天然就是對照着官方文檔詳細理解項目中每一個字段的做用,而且作出一些修改來驗證。android
AndroidManifest官方解釋是應用清單(manifest意思是貨單),每一個應用的根目錄中都必須包含一個,而且文件名必須如出一轍。這個文件中包含了APP的配置信息,系統須要根據裏面的內容運行APP的代碼,顯示界面。併發
上述的功能是很是籠統的解釋,具體到細節就是:app
上面是官方的解釋。不少東西筆者如今還不能理解,也沒有用到,先挑筆者理解的進行解釋。佈局
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample.teapot" android:versionCode="1" android:versionName="1.0.0.1" > <uses-feature android:glEsVersion="0x00020000"></uses-feature> <application android:allowBackup="false" android:fullBackupContent="false" android:supportsRtl="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="com.sample.teapot.TeapotApplication" > <!-- Our activity is the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.sample.teapot.TeapotNativeActivity" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="TeapotNativeActivity" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
這是Google官方示例中的teapots項目中的一個文件,咱們就針對這份文件來分析字段的意義。字段的意義參考的是官方文檔。gradle
首先,全部的xml都必須包含
xmlns:androidcode
這個屬性定義了Android命名空間。必須設置成"http://schemas.android.com/apk/res/android"。不要手動修改。xml
package對象
這是一個完整的Java語言風格包名。包名由英文字母(大小寫都可)、數字和下劃線組成。每一個獨立的名字必須以字母開頭。
構建APK的時候,構建系統使用這個屬性來作兩件事:
好比:package被設置成com.sample.teapot,那麼生成的R類就是:com.sample.teapot.R
包名也表明着惟一的application ID,用來發布應用。可是,要注意的一點是:在APK構建過程的最後一步,package名會被build.gradle文件中的applicationId屬性取代。若是這兩個屬性值同樣,那麼萬事大吉,若是不同,那就要當心了。
android:versionCode
內部的版本號。用來代表哪一個版本更新。這個數字不會顯示給用戶。顯示給用戶的是versionName。這個數字必須是整數。不能用16進制,也就是說不接受"0x1"這種參數
android:versionName
顯示給用戶看的版本號。
Google Play利用這個元素的值從不符合應用須要的設備上將應用過濾。
這東西的做用是將APP所依賴的硬件或者軟件條件告訴別人。它說明了APP的哪些功能能夠隨設備的變化而變化。
使用的時候要注意,必須在單獨的
<uses-feature android:name="android.hardware.bluetooth" /> <uses-feature android:name="android.hardware.camera" />
android:name
該屬性以字符串形式指定了APP要用的硬件或軟件功能。
android:required
這項屬性若是值爲true表示須要這項功可否則應用沒法工做,若是爲false表示應用在必要時會使用該功能,可是若是沒有此功能應用也能工做。
android:glEsVersion
指明應用須要的Opengl ES版本。高16位表示主版本號,低16位表示次版本號。例如,若是是要3.2的版本,就是0x00030002。若是定義多個glEsVersion,應用會自動啓用最高的設置。
此元素描述了應用的配置。這是一個必備的元素,它包含了不少子元素來描述應用的組件,它的屬性影響到全部的子組件。許多屬性(例如icon、label、permission、process、taskAffinity和allowTaskReparenting)均可以設置成默認值。
android:allowBackup
表示是否容許APP加入到備份還原的結構中。若是設置成false,那麼應用就不會備份還原。默認值爲true。
android:fullBackupContent
這個屬性指向了一個xml文件,該文件中包含了在進行自動備份時的徹底備份規則。這些規則定義了哪些文件須要備份。此屬性是一個可選屬性。默認狀況下,自動備份包含了大部分app文件。
android:supportsRtl
聲明你的APP是否支持RTL(Right To Left)佈局。若是設置成true,而且targetSdkVersion被設置成17或更高。不少RTL API會被集火,這樣你的應用就能夠顯示RTL佈局了。若是設置成false或者targetSdkVersion被設置成16或更低。哪些RTL API就不起做用了。
該屬性的默認的值是false。
android:icon
APP的圖標,以及每一個組件的默認圖標。能夠在組價中自定義圖標。這個屬性必須設置成一個引用,指向一個可繪製的資源,這個資源必須包含圖片。系統不設置默認圖標。例如mipmap/ic_launcher引用的就是下面的資源
android:label
一個用戶可讀的標籤,以及全部組件的默認標籤。子組件能夠用他們的label屬性定義本身的標籤,若是沒有定義,那麼就用這個標籤。
標籤必須設置成一個字符串資源的引用。這樣它們就能和其餘東西同樣被定位,好比@string/app_name。固然,爲了開發方便,你也能夠定義一個原始字符串。
android:theme
該屬性定義了應用使用的主題的,它是一個指向style資源的引用。各個activity也能夠用本身的theme屬性設置本身的主題。
android:name
Application子類的全名。包括前面的路徑。例如com.sample.teapot.TeapotApplication。當應用啓動時,這個類的實例被第一個建立。這個屬性是可選的,大多數APP都不須要這個屬性。在沒有這個屬性的時候,Android會啓動一個Application類的實例。
該元素聲明一個實現應用可視化界面的Activity(Activity類子類)。這是
android:name
Activity類的名稱,是Activity類的子類。該屬性值爲徹底限定類名稱,例如com.sample.teapot.TeapotNativeActivity。爲了方便起見,若是第一個字符是點('.'),就須要加上
沒有默認值,必須指定該名稱。
android:label
Activity標籤,能夠被用戶讀取。該標籤會在Activity激活時顯示在屏幕上。若是未設置,用
android:configChanges
列出 Activity 將自行處理的配置更改消息。在運行時發生配置更改時,默認狀況下會關閉 Activity 而後將其從新啓動,但使用該屬性聲明配置將阻止 Activity 從新啓動。 Activity 反而會保持運行狀態,而且系統會調用其 onConfigurationChanged()方法。
注:應避免使用該屬性,而且只應在萬不得已的狀況下使用。 如需瞭解有關如何正確處理配置更改所致從新啓動的詳細信息,請閱讀處理運行時變動。
這屬性能夠設置的項不少,這裏列出經常使用的項:
orientation
屏幕放心啊發生了變化,好比用戶旋轉了設備
keyboardHidden
鍵盤無障礙功能發生了變化,好比用戶顯示了硬件鍵盤
android:launchMode
關於如何啓動Activity的指令。一共有四種指令:
指定額外的數據項,該數據項是一個name-value對,提供給其父組件。這些數據會組成一個Bundle對象,能夠由PackageItemInfo.metaData字段使用。雖然可使用多個
該元素有三個屬性:
android:name
數據項名稱,這是一個惟一值。
android:resource
一個資源的引用。
android:value
數據項的值。
指明這個activity能夠以什麼樣的意圖(intent)啓動。該元素有幾個子元素能夠包含。咱們先介紹遇到的這兩個:
表示activity做爲一個什麼動做啓動,android.intent.action.MAIN表示做爲主activity啓動。
這是action元素的額外類別信息,android.intent.category.LAUNCHER表示這個activity爲當前應用程序優先級最高的Activity。
至此,全部的元素信息已經分析完畢,若有錯誤,歡迎各位讀者指正。後面再遇到什麼元素會繼續往裏面添加。