簡述AndroidManifest.xml的作用是什麼?

2020-11-25 15:01:07

作用:1、描述app的包名;2、描述app使用的android系統版本資訊;3、描述app本身的版本資訊,這樣對於同一個app的兩個版本,系統就能區分那個是新版本,哪個是舊版本;4、描述應用對外暴露的元件等等。

我們在進行APP開發的時候都會遇到一個檔案:AndroidManifest.xml。從剛開始進行Android開發,到現在已經過去了幾個月,還是對這個檔案一知半解,只知道它是設定用的。但是這檔案裡的東西具體有什麼用,該怎麼用一直都沒有理解。藉著做專案的機會,仔細研究一下這個檔案。

研究AndroidManifest.xml最好的方式自然就是對照著官方檔案詳細理解專案中每個欄位的作用,並且做出一些修改來驗證。

AndroidManifest是什麼?AndroidManifest.xml是一個什麼檔案?

AndroidManifest官方解釋是應用清單(manifest意思是貨單),每個應用的根目錄中都必須包含一個,並且檔名必須一模一樣。這個檔案中包含了APP的設定資訊,系統需要根據裡面的內容執行APP的程式碼,顯示介面。

AndroidManifest.xml是每個apk(zip)檔案解壓後根目錄下的一個檔案,每個apk都必須包含一個AndroidManifest.xml檔案,且名字必須與此完全一致.

AndroidManifest.xml的作用是什麼?

  • 描述app的包名:

    Android裝置據此區分不同的app,如果每個app是一個人的話,包名就相當於是這個人的名字(為了防止惡意軟體仿冒其他app,只有新的app的包名和簽名均與舊的app相同時才能升級覆蓋安裝成功).

  • 描述app使用的android系統版本資訊:

    因為android系統在不斷的升級,新的系統版本會增加新的API,但是舊的Android裝置上並沒有這些API,那麼就會出現新版本的應用使用新的API但是在舊的系統上執行的問題(在舊的系統上呼叫新的API應用會崩潰),因此需要說明本應用支援的最低android系統版本是哪個,比如說將minSdkVersion設定為19就是說這個應用在API19以及以上的裝置上執行沒有問題.

  • 描述app本身的版本資訊,這樣對於同一個app的兩個版本,系統就能區分那個是新版本,哪個是舊版本.

  • 很重要的一個作用是描述應用對外暴露的元件(或者叫介面):

    Activity,Service,Provider,BroadcastReceiver這四大元件的每一個都可以獨立執行,都可以作為app啟動的入口點。

    AndroidManifest.xml可以告知系統點選應用圖示後進入哪個Activity;可以告知系統本應用某個類(BroadcastReceiver的子類)需要監聽網路變化等資訊(廣播);告知系統本應用可以其他應用提供服務(ContentProvider和Service);告知系統本應用某些類能夠處理一些特定的請求(比如開啟pdf擴充套件名的檔案);等等

  • 其他各種需要用文字直接告知系統的:比如申請的許可權,應用的主題等等。

歸根結底就是Android系統的app需要通過文字方式直接告訴系統的資訊太多了

一份真實的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

顯示給使用者看的版本號。

1.webp.jpg

<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參照的就是下面的資源

2.webp.jpg

android:label

一個使用者可讀的標籤,以及所有元件的預設標籤。子元件可以用他們的label屬性定義自己的標籤,如果沒有定義,那麼就用這個標籤。

標籤必須設定成一個字串資源的參照。這樣它們就能和其他東西一樣被定位,比如@string/app_name。當然,為了開發方便,你也可以定義一個原始字串。

3.webp.jpg

android:theme

該屬性定義了應用使用的主題的,它是一個指向style資源的參照。各個activity也可以用自己的theme屬性設定自己的主題。

4.webp.jpg

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。

更多程式設計相關知識,請存取:!!

以上就是簡述AndroidManifest.xml的作用是什麼?的詳細內容,更多請關注TW511.COM其它相關文章!