AndroidManifest.xml檔案內容詳解
一、重要性
AndroidManifest.xml是Android應用程式中最重要的檔案之一。它是Android程式的全域性配置檔案,是每個 android程式中必須的檔案。它位於我們開發的應用程式的根目錄下,描述了package中的全域性資料,包括package中暴露的元件 (activities, services, 等等),以及他們各自的實現類,各種能被處理的資料和啟動位置等重要資訊。
因此,該檔案提供了Android系統所需要的關於該應用程式的必要資訊,即在該應用程式的任何程式碼執行之前系統所必須擁有的資訊。
二、主要功能
它指定了該應用程式的Java包:該包名作為應用程式的一個獨特標識。
它描述了應用程式元件:該應用程式由哪些activity,service,broadcast receiver和content provider組成。它指定了實現每個元件的類以及公開發布它們的能力(例如,它們能持有哪個Intent資訊)。這些宣告使Android系統知道這 兒有什麼元件以及在什麼條件下它們可以被載入。
它決定那些程式將容納應用程式元件。
它宣告瞭本應用程式必須擁有哪些許可,以便訪問API的被保護部分,以及與其他應用程式互動。
它也宣告瞭其他應用程式在和該應用程式互動時需要持有的許可。
它列出了Instrumentation類,可以在應用程式執行時提供簡檔和其他資訊。這些宣告僅當應用程式在開發和測試過程中被提供;它們將在應用程式正式釋出之前被移除。
它宣告瞭該應用程式所需的Android API的最小化水平。
它列出了該應用程式必須連結的庫。
三、主要結構及規則
下面列表顯示了manifest檔案的通常的結構以及它可以含有的元素。每個元素,連同它的所有屬性,會在各個單獨的文件裡進行充分的描繪。
<?xml version="1.0" encoding="utf-8"?> <manifest> //根節點,描述了package中所有的內容 <uses-permission /> //請求你的package正常運作所需賦予的安全許可。一個manifest能包含零個或更多此元素 <permission /> //宣告瞭安全許可來限制哪些程式能使用你的package中的元件和功能。一個manifest能包含零個或更多此元素 <permission-tree /> <permission-group /> <instrumentation /> //宣告瞭用來測試此package或其他package指令元件的程式碼。一個manifest能包含零個或更多此元素 <uses-sdk /> //指定當前應用程式相容的最低sdk版本號 <application> //包含package中application級別元件宣告的根節點。此元素也可包含 application中全域性和預設的屬性,如標籤,icon,主題,必要的許可權,等等。一個manifest能包含零個或一個此元素(不允許多餘一個) <activity> //用來與使用者互動的主要工具。當使用者開啟一個應用程式的初始頁面時一個activity,大部分被使用到的其他頁面也由不同的activity所實現並宣告在另外的activity標記中。 <intent-filter> //宣告瞭指定的一組元件支援的Intent值 <action /> <category /> <data /> <type/> <schema/> <authority/> <path/> </intent-filter> <meta-data /> </activity> <activity-alias> <intent-filter> . . . </intent-filter> <meta-data /> </activity-alias> <service> //Service是能在後臺執行任意時間的元件 <intent-filter> . . . </intent-filter> <meta-data/> </service> <receiver> //IntentReceiver能使你的application獲得資料的改變或者發生的操作,即使它當前不在執行 <intent-filter> . . . </intent-filter> <meta-data /> </receiver> <provider> //ContentProvider是用來管理持久化資料併發布給其他應用程式使用的元件 <grant-uri-permission /> <meta-data /> </provider> <uses-library /> <uses-configuration /> </application> </manifest>
下面是按照字母順序排列的所有可以出現在manifest檔案裡的元素。它們是唯一合法的元素;你不能加入你自己的元素或屬性。
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<uses-configuration>
<uses-library>
<uses-permission>
<uses-sdk>
說明:AndroidManifest.xml檔案的結構、元素,以及元素的屬性,可以在Android SDK文件中檢視詳細說明。而在看這些眾多的元素以及元素的屬性前,需要先了解一下這些元素在命名、結構等方面的規則:
元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出現一次。如果一個元素包含有其他子元素,必須通過子元素的屬性來設定其值。處於同一層次的元素,這些元素的說明是沒有順序的。
屬性:按照常理,所有的屬性都是可選的,但是有些屬性是必須設定的。那些真正可選的屬性,即使不存在,其也有預設的數值項說明。除了根元素<manifest>的屬性,所有其他元素屬性的名字都是以android:字首的;
定義類名:所有的元素名都對應其在SDK中的類名,如果你自己定義類名,必須包含類的資料包名,如果類與application處於同一資料包中,可以直接簡寫為“.”;
多數值項:如果某個元素有超過一個數值,這個元素必須通過重複的方式來說明其某個屬性具有多個數值項,且不能將多個數值項一次性說明在一個屬性中;
資源項說明:當需要引用某個資源時,其採用如下格式:@[package :]type :name 。 例如 <activity android:icon=”@drawable/icon ” . . . >
字串值:類似於其他語言,如果字元中包含有字元“\”,則必須使用轉義字元“\\”;
四,詳細說明 值得一提一些常用之處:
1,幾乎所有的AndroidManifest.xml(以及許多其他Android的xml的檔案)在第一個元 素中包含了名稱空間的宣告 xmlns:android=”http://schemas.android.com/apk/res/android”。這樣使得Android中各 種標準屬效能在檔案中使用,提供了大部分元素中的資料。
2,大部分manifests包含了單個<application>的元素,它定義了所有的application級別元件和屬性,並能在package中使用。
3, 任何被使用者看作頂層應用程式,並能被程式啟動器所用的package,需要包含至少一個Activity元件來支援MAIN操作和LAUNCHER種 類。動作android.intent.action.MAIN指示這是應用程式的入口點。類別 android.intent.category.LAUNCHER將此Activity放在啟動器視窗中。
在最外層 的<manifest>中包含了包名如 package=”cn.androidlover.demo” 、軟體的版本號 android:versionCode=”1″ 以及 android:versionName=”1.0″的屬性,而裡面一層的<application>分支中將可能包含Android程式的 四種物件 Activity、Service、Content Provider以及Receiver。我們每新增上面四個型別中的任一種新物件都需要在androidmanifest.xml檔案中新增相應節點,否 則執行時將會產生異常。每一個activity必須要一個<activity>標記對應,無論它給外部使用或是隻用於自己的package 中。如果一個activity沒有對應的標記,你將不能執行它。
此檔案一個重要的地方就是它所包含的intent-filters。這些 filters描述了activity啟動的位置和時間。每當一個 activity(或者作業系統)要執行一個操作,例如:開啟網頁或聯絡簿時,它建立出一個intent的物件。它能承載一些資訊描述了你想做什麼,你想 處理什麼資料,資料的型別,和一些其他資訊。Android比較了intent物件中和每個application所暴露的intent-filter中 的資訊,來找到最合適的activity來處理呼叫者所指定的資料和操作。關於intent的更多資訊請訪問Intent參考頁面。
application屬性介紹:
有 關AndroidManifest.xml檔案的application分支我們有必要了解一些常見的屬性,這裡可以看到一些我們實用的選項,比如允許 除錯android:debuggable、任務關係android:taskAffinity,比如我們常見的方式建立一個新的任務實用標記 FLAG_ACTIVITY_NEW_TASK,為程式制定一個主題,可以使用android:theme指向一個主題檔案。平時我們建立的程式使用一些 安全敏感項,會需要請求系統許可許可權,這裡可以使用android:permission來制定相關的許可,每個程式的service、 activity、content provider、receiver都需要在application的節點內實現。有關完整的屬性可以檢視:
:debuggable、任務關係android:taskAffinity,比如我們常見的方式建立一個新的任務實用標記 FLAG_ACTIVITY_NEW_TASK,為程式制定一個主題,可以使用android:theme指向一個主題檔案。平時我們建立的程式使用一些 安全敏感項,會需要請求系統許可許可權,這裡可以使用android:permission來制定相關的許可,每個程式的service、 activity、content provider、receiver都需要在application的節點內實現。有關完整的屬性可以檢視:
application android:allowClearUserData=["true" | "false"] android:allowTaskReparenting=["true" | "false"] android:debuggable=["true" | "false"] android:description="string resource" android:enabled=["true" | "false"] android:hasCode=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:manageSpaceActivity="string" android:name="string" android:permission="string" android:persistent=["true" | "false"] android:process="string" android:taskAffinity="string" android:theme="resource or theme" > . . . </application>
另外:Activity的屬性常用的可能為android:name和android:label兩個,但我們需要了解所有的屬性以幫助解決複雜的問題,完整的如下:
android:allowTaskReparenting=["true" | "false"] android:alwaysRetainTaskState=["true" | "false"] android:clearTaskOnLaunch=["true"" | "false"] android:configChanges=[one or more of: "mcc" "mnc" "locale" "touchscreen" "keyboard" "keyboardHidden" "navigation" "orientation" "fontScale"] android:enabled=["true" | "false"] android:excludeFromRecents=["true" | "false"] android:exported=["true" | "false"] android:finishOnTaskLaunch=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"] android:multiprocess=["true" | "false"] android:name="string" android:noHistory=["true" | "false"] android:permission="string" android:process="string" android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nonsensor"] android:stateNotNeeded=["true" | "false"] android:taskAffinity="string" android:theme="resource or theme" android:windowSoftInputMode=[one or more of: "stateUnspecified" "stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible" "stateAlwaysVisible" "adjustUnspecified" "adjustResize" "adjustPan"]
從Provider節點中用到的定義,可以看到包含了許可權控制、排序方式完整的如下:
<provider android:authorities="list" android:enabled=["true" | "false"] android:exported=["true" | "false"] android:grantUriPermissions=["true" | "false"] android:icon="drawable resource" android:initOrder="integer" android:label="string resource" android:multiprocess=["true" | "false"] android:name="string" android:permission="string" android:process="string" android:readPermission="string" android:syncable=["true" | "false"] android:writePermission="string" > </provider>
而對於服務相關定義如下:
<service android:enabled=["true" | "false"] android:exported[="true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string" > </service>
最後是Broadcast使用的Receiver定義,一般配合和隱式處理。
<receiver android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string" > </receiver>
總之,AndroidManifest.xml檔案雖然看起來複雜,但是,只要我們理清中裡面各元素的作用,那麼一切就變得簡單了。
相關文章
- AndroidManifest.xml檔案詳解AndroidXML
- AndroidManifest.xml配置檔案詳解 .AndroidXML
- MyBatis 核心配置檔案詳細內容詳解MyBatis
- Redis.conf配置檔案內容詳解Redis
- python實現修改xml檔案內容詳解PythonXML
- Windows登錄檔內容詳解Windows
- java檔案相關(檔案追加內容、檔案內容清空、檔案內容讀取)Java
- Android學習筆記之AndroidManifest.xml檔案解析(詳解)Android筆記XML
- API讀取寫入 ini檔案內容的方法函式詳解API函式
- 檔案內容拷貝
- Oracle 控制檔案內容Oracle
- 檔案內容比較
- vim內替換檔案內容
- 清空listener.log檔案內容後,內容不能寫入listener.log檔案的解決方法
- AndroidManifest.xml檔案解析AndroidXML
- 瞭解raw trace檔案的各項內容
- 檔案內容對比工具
- C#分割檔案內容C#
- git檢視檔案內容Git
- properties檔案內容亂碼
- Linux檔案內容操作Linux
- 檢視控制檔案內容
- dump 轉儲檔案內容
- 提取rpm檔案內容
- 使用ln同步檔案內容,支援忽略檔案
- 清單檔案 AndroidManifest.xmlAndroidXML
- 標頭檔案sys/types.h 內容解釋
- vite vue-cli 讀取檔案原始內容 使用base64內容的檔案ViteVue
- Java核心內容面試題詳解Java面試題
- 實用解析dmp檔案內容
- 命令列技巧:分割檔案內容命令列
- php獲取xml檔案內容PHPXML
- node中給檔案追加內容
- mybatis讀取properties檔案內容MyBatis
- js直接列印pdf檔案內容JS
- PowerShell輸出內容到檔案
- 控制檔案包含哪些基本內容
- 檔案內容查詢命令(轉)