AndroidManifest是什么?
AndroidManifest官方解釋是應用清單(manifest意思是貨單),每個應用的根目錄中都必須包含一個,並且文件名必須一模一樣。這個文件中包含了APP的配置信息,系統需要根據里面的內容運行APP的代碼,顯示界面。
AndroidManifest的作用是什么?
上述的功能是非常籠統的解釋,具體到細節就是:
- 為應用的 Java 軟件包命名。軟件包名稱充當應用的唯一標識符。
- 描述應用的各個組件,包括構成應用的 Activity、服務、廣播接收器和內容提供程序。它還為實現每個組件的類命名並發布其功能,例如它們可以處理的 Intent 消息。這些聲明向 Android 系統告知有關組件以及可以啟動這些組件的條件的信息。
- 確定托管應用組件的進程。
- 聲明應用必須具備哪些權限才能訪問 API 中受保護的部分並與其他應用交互。還聲明其他應用與該應用組件交互所需具備的權限
- 列出 Instrumentation類,這些類可在應用運行時提供分析和其他信息。這些聲明只會在應用處於開發階段時出現在清單中,在應用發布之前將移除。
- 聲明應用所需的最低 Android API 級別
- 列出應用必須鏈接到的庫
上面是官方的解釋。很多東西筆者現在還不能理解,也沒有用到,先挑筆者理解的進行解釋。
-
第一條:提供軟件包名。這就是我們的apk的名字,通常我們的名字都是類似"com.android.gles3jni"這種,和Java類名類似,目的是確定使其成為一個唯一值。
-
第二條:描述應用的各個組件。這是用來定義四大組件用的。我們最常用的就是Activity組件。它需要定義組件的表現形式(組件名、主題、啟動類型),組件可以響應的操作(例如某個啟動意圖)等。
-
第三條、第四條和第五條:還沒用到,不做解釋。
-
第五條:聲明最低API級別。這個級別在build.gradle文件中也能定義,字段是minSdkVersion。在AndroidManifest.xml文件中定義的情況比較少。
-
第六條:列出必要的lib庫。這東西在3.0以后的Android Studio似乎也沒什么功能,因為在3.0以后編譯用的是CMakeLists.txt文件,以及build.gradle文件來指定庫。
一份真實的AndroidManifest.xml文件
<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項目中的一個文件,我們就針對這份文件來分析字段的意義。字段的意義參考的是官方文檔。
<manifest>元素
首先,所有的xml都必須包含<manifest>元素。這是文件的根節點。它必須要包含<application>元素,並且指明xmlns:android和package屬性。
<manifest>元素中的屬性
xmlns:android
這個屬性定義了Android命名空間。必須設置成"http://schemas.android.com/apk/res/android"。不要手動修改。
package
這是一個完整的Java語言風格包名。包名由英文字母(大小寫均可)、數字和下划線組成。每個獨立的名字必須以字母開頭。
構建APK的時候,構建系統使用這個屬性來做兩件事:
- 1、生成R.java類時用這個名字作為命名空間(用於訪問APP的資源)
比如:package被設置成com.sample.teapot,那么生成的R類就是:com.sample.teapot.R - 2、用來生成在manifest文件中定義的類的完整類名。比如package被設置成com.sample.teapot,並且activity元素被聲明成<activity android:name=".MainActivity">,完整的類名就是com.sample.teapot.MainActivity。
包名也代表着唯一的application ID,用來發布應用。但是,要注意的一點是:在APK構建過程的最后一步,package名會被build.gradle文件中的applicationId屬性取代。如果這兩個屬性值一樣,那么萬事大吉,如果不一樣,那就要小心了。
android:versionCode
內部的版本號。用來表明哪個版本更新。這個數字不會顯示給用戶。顯示給用戶的是versionName。這個數字必須是整數。不能用16進制,也就是說不接受"0x1"這種參數
android:versionName
顯示給用戶看的版本號。

<manifest>元素中的元素
<uses-feature>元素
Google Play利用這個元素的值從不符合應用需要的設備上將應用過濾。
這東西的作用是將APP所依賴的硬件或者軟件條件告訴別人。它說明了APP的哪些功能可以隨設備的變化而變化。
使用的時候要注意,必須在單獨的<uses-feature>元素中指定每個功能,如果要多個功能,需要多個<uses-feture>元素。比如要求設備同時具有藍牙和相機功能:
<uses-feature android:name="android.hardware.bluetooth" /> <uses-feature android:name="android.hardware.camera" />
<uses-feature>的屬性
android:name
該屬性以字符串形式指定了APP要用的硬件或軟件功能。
android:required
這項屬性如果值為true表示需要這項功能否則應用無法工作,如果為false表示應用在必要時會使用該功能,但是如果沒有此功能應用也能工作。
android:glEsVersion
指明應用需要的Opengl ES版本。高16位表示主版本號,低16位表示次版本號。例如,如果是要3.2的版本,就是0x00030002。如果定義多個glEsVersion,應用會自動啟用最高的設置。
<application>元素
此元素描述了應用的配置。這是一個必備的元素,它包含了很多子元素來描述應用的組件,它的屬性影響到所有的子組件。許多屬性(例如icon、label、permission、process、taskAffinity和allowTaskReparenting)都可以設置成默認值。
<application>的屬性
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(Activity類子類)。這是<application>元素中必要的子元素。所有Activity都必須由清單文件中的<activity>元素表示。任何未在該處聲明的Activity對系統都不可見,並且永遠不會被執行。
android:name
Activity類的名稱,是Activity類的子類。該屬性值為完全限定類名稱,例如com.sample.teapot.TeapotNativeActivity。為了方便起見,如果第一個字符是點('.'),就需要加上<manifest>元素中的包名。應用一旦發布,不應更改該名稱。
沒有默認值,必須指定該名稱。
android:label
Activity標簽,可以被用戶讀取。該標簽會在Activity激活時顯示在屏幕上。如果未設置,用<application>中的label屬性。對屬性的設置要求和<application>中一樣。
android:configChanges
列出 Activity 將自行處理的配置更改消息。在運行時發生配置更改時,默認情況下會關閉 Activity 然后將其重新啟動,但使用該屬性聲明配置將阻止 Activity 重新啟動。 Activity 反而會保持運行狀態,並且系統會調用其 onConfigurationChanged()方法。
注:應避免使用該屬性,並且只應在萬不得已的情況下使用。 如需了解有關如何正確處理配置更改所致重新啟動的詳細信息,請閱讀處理運行時變更。
這屬性可以設置的項很多,這里列出常用的項:
- orientation
屏幕放心啊發生了變化,比如用戶旋轉了設備 - keyboardHidden
鍵盤無障礙功能發生了變化,比如用戶顯示了硬件鍵盤 - android:launchMode
關於如何啟動Activity的指令。一共有四種指令:
“standard”
“singleTop”
“singleTask”
“singleInstance”
默認情況下是standard。這些模式被分為兩大類:"standard"和"singleTop"是一類。該模式的Activity可以多次實例化。實例可屬於任何任務,並且可以位於Activity堆棧中的任何位置。"singleTask"和"singleInstance"是一類。該模式只能啟動任務,它們始終位於Activity堆棧的根位置。此外,設備一次只能保留一個Activity實例。
設置成singleTask后,系統在新任務的根位置創建Activity並向其傳送Intent。如果已經存在一個Activity實例,則系統會通過調用該實例的onNewIntent()方法向其傳送Intent而不是創建一個新的Activity實例。
android:theme
設定主題格式,與<application>中的theme類似。
<meta-data>元素
指定額外的數據項,該數據項是一個name-value對,提供給其父組件。這些數據會組成一個Bundle對象,可以由PackageItemInfo.metaData字段使用。雖然可以使用多個<meta-data>元素標簽,但是不推薦這么使用。如果有多個數據項要指定,推薦做法是:將多個數據項合並成一個資源,然后使用一個<meta-data>包含進去。
該元素有三個屬性:
android:name
數據項名稱,這是一個唯一值。
android:resource
一個資源的引用。
android:value
數據項的值。
<intent-filter>元素
指明這個activity可以以什么樣的意圖(intent)啟動。該元素有幾個子元素可以包含。我們先介紹遇到的這兩個:
<action>元素
表示activity作為一個什么動作啟動,android.intent.action.MAIN表示作為主activity啟動。
<category>元素
這是action元素的額外類別信息,android.intent.category.LAUNCHER表示這個activity為當前應用程序優先級最高的Activity。
作者:閃電的藍熊貓
鏈接:https://www.jianshu.com/p/3b5b89d4e154
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。