AndroidManifest.xml詳解

来源:https://www.cnblogs.com/linhaostudy/archive/2020/02/01/12249053.html
-Advertisement-
Play Games

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


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

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

AndroidManifest是什麼?

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

AndroidManifest的作用是什麼?

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

  • 為應用的 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項目中的一個文件,我們就針對這份文件來分析欄位的意義。欄位的意義參考的是官方文檔。

元素

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

元素中的屬性

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元素被聲明成,完整的類名就是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。

總結

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • @RequestParam 和 @PathVariable 註解是用於從request中接收請求的,兩個都可以接收參數,關鍵點不同的是@RequestParam 是從request裡面拿取值,而 @PathVariable 是從一個URI模板裡面來填充 @RequestParam看下麵一段代碼: h ...
  • 本文將介紹以下內容:Windows下安裝scala運行環境,安裝編譯工具並簡單配置,實現著名的“Hello,World"。 一,Windows下安裝scala運行環境 1.配置jdk,因為scala的運行需要依靠jvm虛擬機,所以在使用scala時需要有java環境 2.官網下載scala包,點擊這 ...
  • 2020年,給自己定一個新目標————開始寫技術博客,將之前所學的內容重新複習並整理成一系列的文章,一來可以讓自己對這些基礎知識更加熟悉,二來方便於以後的複習查閱。 以前自己都是以筆記的形式將知識點記錄在有道雲筆記中,這樣可能造成由於時間緊或者懶,只是記錄了筆記,沒有去深刻的理解。所以乘著這次全面復 ...
  • 前言 最近因為公司需要,需要瞭解下java探針,在網上找資料,發現資料還是有很多的,但是例子太少,有的直接把公司代碼粘貼出來,太複雜了,有的又特別簡單不是我想要的例子, 我想要這樣的一個例子: jvm在運行,我想動態修改一個類,jvm在不用重啟的情況下, 自動載入新的類定義. 動態修改類定義,聽著感 ...
  • web應用常見的資源存方式 在WEB-INF下新建lib,存放要使用的jar包 在WEB-INF下新建jsp文件夾,存放jsp文件。首頁除外,首頁就放到web下。 在web下,或WEB-INF下,新建css、js、image文件夾,存放相關文件。 WEB-INF目錄是web應用的安全目錄,裡面的資源 ...
  • Spring官方支持的服務的渲染模板中,並不包含jsp。而是Thymeleaf和Freemarker等,而Thymeleaf與SpringMVC的視圖技術,及SpringBoot的自動化配置集成非常完美,幾乎沒有任何成本,你只用關註Thymeleaf的語法即可。 Thymeleaf的特點 動靜結合: ...
  • 繼承關係用不好女人也可以是男人,複合關係用不好「狗中有人,人中有狗」的事情也會有。 ...
  • 第一種註冊方法 from flask import Flask app = Flask(__name__) @app.route("/hello") # 第一種註冊方法 def hello(): return "hello python!!!" if __name__ == "__main__": ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...