AndroidManifest.xml詳解

咱們在進行APP開發的時候都會遇到一個文件:AndroidManifest.xml。從剛開始進行Android開發,到如今已通過去了幾個月,仍是對這個文件只知其一;不知其二,只知道它是配置用的。可是這文件裏的東西具體有什麼用,該怎麼用一直都沒有理解。藉着作項目的機會,仔細研究一下這個文件。java

研究AndroidManifest.xml最好的方式天然就是對照着官方文檔詳細理解項目中每一個字段的做用,而且作出一些修改來驗證。android

AndroidManifest是什麼?

AndroidManifest官方解釋是應用清單(manifest意思是貨單),每一個應用的根目錄中都必須包含一個,而且文件名必須如出一轍。這個文件中包含了APP的配置信息,系統須要根據裏面的內容運行APP的代碼,顯示界面。併發

AndroidManifest的做用是什麼?

上述的功能是很是籠統的解釋,具體到細節就是:app

  • 爲應用的 Java 軟件包命名。軟件包名稱充當應用的惟一標識符。
  • 描述應用的各個組件,包括構成應用的 Activity、服務、廣播接收器和內容提供程序。它還爲實現每一個組件的類命名併發布其功能,例如它們能夠處理的 Intent 消息。這些聲明向 Android 系統告知有關組件以及能夠啓動這些組件的條件的信息。
  • 肯定託管應用組件的進程。
  • 聲明應用必須具有哪些權限才能訪問 API 中受保護的部分並與其餘應用交互。還聲明其餘應用與該應用組件交互所需具有的權限
  • 列出 Instrumentation類,這些類可在應用運行時提供分析和其餘信息。這些聲明只會在應用處於開發階段時出如今清單中,在應用發佈以前將移除。
  • 聲明應用所需的最低 Android API 級別
  • 列出應用必須連接到的庫

上面是官方的解釋。不少東西筆者如今還不能理解,也沒有用到,先挑筆者理解的進行解釋。佈局

一份真實的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項目中的一個文件,咱們就針對這份文件來分析字段的意義。字段的意義參考的是官方文檔。gradle

元素

首先,全部的xml都必須包含 元素。這是文件的根節點。它必需要包含 元素,而且指明xmlns:android和package屬性。 ui

元素中的屬性

xmlns:androidcode

這個屬性定義了Android命名空間。必須設置成"http://schemas.android.com/apk/res/android"。不要手動修改。xml

package對象

這是一個完整的Java語言風格包名。包名由英文字母(大小寫都可)、數字和下劃線組成。每一個獨立的名字必須以字母開頭。

構建APK的時候,構建系統使用這個屬性來作兩件事:

  • 一、生成R.java類時用這個名字做爲命名空間(用於訪問APP的資源)

好比:package被設置成com.sample.teapot,那麼生成的R類就是:com.sample.teapot.R

  • 二、用來生成在manifest文件中定義的類的完整類名。好比package被設置成com.sample.teapot,而且activity元素被聲明成 ,完整的類名就是com.sample.teapot.MainActivity。

包名也表明着惟一的application ID,用來發布應用。可是,要注意的一點是:在APK構建過程的最後一步,package名會被build.gradle文件中的applicationId屬性取代。若是這兩個屬性值同樣,那麼萬事大吉,若是不同,那就要當心了。

android:versionCode

內部的版本號。用來代表哪一個版本更新。這個數字不會顯示給用戶。顯示給用戶的是versionName。這個數字必須是整數。不能用16進制,也就是說不接受"0x1"這種參數

android:versionName

顯示給用戶看的版本號。

image

元素中的元素

元素

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引用的就是下面的資源

image

android:label

一個用戶可讀的標籤,以及全部組件的默認標籤。子組件能夠用他們的label屬性定義本身的標籤,若是沒有定義,那麼就用這個標籤。

標籤必須設置成一個字符串資源的引用。這樣它們就能和其餘東西同樣被定位,好比@string/app_name。固然,爲了開發方便,你也能夠定義一個原始字符串。

image

android:theme

該屬性定義了應用使用的主題的,它是一個指向style資源的引用。各個activity也能夠用本身的theme屬性設置本身的主題。

image

android:name

Application子類的全名。包括前面的路徑。例如com.sample.teapot.TeapotApplication。當應用啓動時,這個類的實例被第一個建立。這個屬性是可選的,大多數APP都不須要這個屬性。在沒有這個屬性的時候,Android會啓動一個Application類的實例。

元素

該元素聲明一個實現應用可視化界面的Activity(Activity類子類)。這是 元素中必要的子元素。全部Activity都必須由清單文件中的 元素表示。任何未在該處聲明的Activity對系統都不可見,而且永遠不會被執行。

android:name

Activity類的名稱,是Activity類的子類。該屬性值爲徹底限定類名稱,例如com.sample.teapot.TeapotNativeActivity。爲了方便起見,若是第一個字符是點('.'),就須要加上 元素中的包名。應用一旦發佈,不該更改該名稱。

沒有默認值,必須指定該名稱。

android:label

Activity標籤,能夠被用戶讀取。該標籤會在Activity激活時顯示在屏幕上。若是未設置,用 中的label屬性。對屬性的設置要求和 中同樣。

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
    設定主題格式,與 中的theme相似。

元素

指定額外的數據項,該數據項是一個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。

總結

至此,全部的元素信息已經分析完畢,若有錯誤,歡迎各位讀者指正。後面再遇到什麼元素會繼續往裏面添加。

相關文章
相關標籤/搜索