1. 程式人生 > >一篇就夠了系列之Android Manifest全解析

一篇就夠了系列之Android Manifest全解析

前言:

前面幾篇介紹了android四大元件的知識,可以發現,四大元件都必須在一個叫AndroidManifest.xml檔案中進行註冊,那麼該檔案的作用是什麼呢?你們的內容各有什麼意義呢?帶著這些疑問,來開始下面內容的學習。官方文件,很詳細

作用:

  • 清單檔案向 Android 系統提供應用的必要資訊,系統必須具有這些資訊方可執行應用的任何程式碼
  • 為應用的 Java 軟體包命名。軟體包名稱充當應用的唯一識別符號
  • 描述應用的各個元件,包括構成應用的 Activity、服務、廣播接收器和內容提供程式。它還為實現每個元件的類命名併發布其功能,例如它們可以處理的 Intent 訊息。這些宣告向 Android 系統告知有關元件以及可以啟動這些元件的條件的資訊
  • 確定託管應用元件的程序
  • 宣告應用必須具備哪些許可權才能訪問 API 中受保護的部分並與其他應用互動。還宣告其他應用與該應用元件互動所需具備的許可權
  • 列出 Instrumentation 類,這些類可在應用執行時提供分析和其他資訊。這些宣告只會在應用處於開發階段時出現在清單中,在應用釋出之前將移除
  • 宣告應用所需的最低 Android API 級別
  • 列出應用必須連結到的庫

內容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wenyi.interview">
<permission android:name="interview.permission.MY_BROADCAST_PERMISSION" android:protectionLevel="normal"/> <uses-permission android:name="interview.permission.MY_BROADCAST_PERMISSION"/> <uses-permission android:name
="android.permission.READ_CONTACTS"/>
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <data android:scheme="myscheme"/> </intent-filter> </activity> <activity android:name=".ScrollingActivity" android:label="@string/title_activity_scrolling" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="myscheme"> </data> </intent-filter> </activity> <service android:name=".FourComponet.service.MyService"/> <activity android:name=".FourComponet.service.ServiceActivity"> </activity> <service android:name=".FourComponet.service.MyIntentService"/> <activity android:name=".FourComponet.broadcast.BroadcastActivity"> </activity> <receiver android:name=".FourComponet.broadcast.MyReceiver1"> <intent-filter android:priority="-1000"> <action android:name="com.wenyi.interview.mynormalb"/> </intent-filter> </receiver> <receiver android:name=".FourComponet.broadcast.MyReceiver2"> <intent-filter android:priority="1000"> <action android:name="com.wenyi.interview.mynormalb"/> </intent-filter> </receiver> <activity android:name=".FourComponet.contentProvider.ContentProviderActivity"> </activity> <provider android:exported="true" android:enabled="true" android:authorities="com.wenyi.interview.provider" android:name=".FourComponet.contentProvider.MyContentProvider"/> </application> </manifest>

可以發現,主要由以下幾個部分組成:

* 元素*

只有 和 元素是必需的,它們都必須存在並且只能出現一次。其他大部分元素可以出現多次或者根本不出現。但清單檔案中必須至少存在其中某些元素才有用。
如果一個元素包含某些內容,也就包含其他元素。所有值均通過屬性進行設定,而不是通過元素內的字元資料設定。

同一級別的元素通常不分先後順序。例如,、 和 元素可以按任何順序混合在一起。這條規則有兩個主要例外:

元素必須跟在別名所指的 之後。
元素必須是 元素內最後一個元素。換言之, 結束標記必須緊接在 結束標記後。

屬性

從某種意義上說,所有屬性都是可選的。但是,必須指定某些屬性,元素才可實現其目的。請使用本文件作為參考。對於真正可選的屬性,它將指定預設值或宣告缺乏規範時將執行何種操作。
除了根 元素的一些屬性外,所有屬性名稱均以 android: 字首開頭。例如,android:alwaysRetainTaskState。由於該字首是通用的,因此在按名稱引用屬性時,本文件通常會將其忽略。

宣告類名

許多元素對應於 Java 物件,包括應用本身的元素( 元素)及其主要元件:Activity ()、服務 ()、廣播接收器 () 以及內容提供程式 ()。

許可權

uses-permission:用來申明需要的許可權
permission:可以用來定義自己的許可權,然後再進行申明

主要還是來看看四大元件:

Activity:

<activity android:allowEmbedded=["true" | "false"]
          android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:autoRemoveFromRecents=["true" | "false"]
          android:banner="drawable resource"
          android:clearTaskOnLaunch=["true" | "false"]
          android:configChanges=["mcc", "mnc", "locale",
                                 "touchscreen", "keyboard", "keyboardHidden",
                                 "navigation", "screenLayout", "fontScale",
                                 "uiMode", "orientation", "screenSize",
                                 "smallestScreenSize"]
          android:documentLaunchMode=["intoExisting" | "always" |
                                  "none" | "never"]
          android:enabled=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:hardwareAccelerated=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:launchMode=["standard" | "singleTop" |
                              "singleTask" | "singleInstance"]
          android:maxRecents="integer"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:noHistory=["true" | "false"]  
          android:parentActivityName="string" 
          android:permission="string"
          android:process="string"
          android:relinquishTaskIdentity=["true" | "false"]
          android:resizeableActivity=["true" | "false"]
          android:screenOrientation=["unspecified" | "behind" |
                                     "landscape" | "portrait" |
                                     "reverseLandscape" | "reversePortrait" |
                                     "sensorLandscape" | "sensorPortrait" |
                                     "userLandscape" | "userPortrait" |
                                     "sensor" | "fullSensor" | "nosensor" |
                                     "user" | "fullUser" | "locked"]
          android:stateNotNeeded=["true" | "false"]
          android:supportsPictureInPicture=["true" | "false"]
          android:taskAffinity="string"
          android:theme="resource or theme"
          android:uiOptions=["none" | "splitActionBarWhenNarrow"]
          android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"] >   
    . . .
</activity>

包含它的檔案:
<application>
可包含:
<intent-filter> 
<meta-data>

說明:

宣告一個實現應用的部分視覺化使用者介面的 Activity(一個 Activity子類)。 所有 Activity 都必須由清單檔案中的 元素表示。 任何未在該處宣告的 Activity 都將對系統不可見,並且也永遠不會被執行。

屬性:

*android:allowEmbedded*

表示該 Activity 可作為另一 Activity 的嵌入式子項啟動。 它尤其適用於子項所在的容器(如 Display)為另一 Activity 所擁有的情況。 例如,用於 Wear 自定義通知的 Activity 必須宣告此項,以便 Wear 在其上下文流中顯示 Activity,後者位於另一程序中。
該屬性的預設值為 false。

*android:allowTaskReparenting*

當啟動 Activity 的任務接下來轉至前臺時,Activity 是否能從該任務轉移至與其有親和關係的任務 —“true”表示它可以轉移,“false”表示它仍須留在啟動它的任務處。
如果未設定該屬性,則對 Activity 應用由 <application> 元素的相應 allowTaskReparenting 屬性設定的值。 預設值為“false”。

正常情況下,當 Activity 啟動時,會與啟動它的任務關聯,並在其整個生命週期中一直留在該任務處。您可以利用該屬性強制 Activity 在其當前任務不再顯示時將其父項更改為與其有親和關係的任務。該屬性通常用於使應用的 Activity 轉移至與該應用關聯的主任務。

例如,如果電子郵件包含網頁連結,則點選連結會調出可顯示網頁的 Activity。 該 Activity 由瀏覽器應用定義,但作為電子郵件任務的一部分啟動。 如果將其父項更改為瀏覽器任務,它會在瀏覽器下一次轉至前臺時顯示,當電子郵件任務再次轉至前臺時則會消失。

Activity 的親和關係由 taskAffinity 屬性定義。 任務的親和關係通過讀取其根 Activity 的親和關係來確定。因此,按照定義,根 Activity 始終位於具有相同親和關係的任務之中。 由於具有“singleTask”或“singleInstance”啟動模式的 Activity 只能位於任務的根,因此更改父項僅限於“standard”和“singleTop”模式。 (另請參閱 launchMode 屬性。)

android:alwaysRetainTaskState
系統是否始終保持 Activity 所在任務的狀態 —“true”表示保持,“false”表示允許系統在特定情況下將任務重置到其初始狀態。 預設值為“false”。該屬性只對任務的根 Activity 有意義;對於所有其他 Activity,均忽略該屬性。
正常情況下,當用戶從主螢幕重新選擇某個任務時,系統會在特定情況下清除該任務(從根 Activity 之上的堆疊中移除所有 Activity)。 系統通常會在使用者一段時間(如 30 分鐘)內未訪問任務時執行此操作。

不過,如果該屬性的值是“true”,則無論使用者如何到達任務,將始終返回到最後狀態的任務。 例如,在網路瀏覽器這類存在大量使用者不願失去的狀態(如多個開啟的標籤)的應用中,該屬性會很有用。

*android:autoRemoveFromRecents*

由具有該屬性的 Activity 啟動的任務是否一直保留在概覽螢幕中,直至任務中的最後一個 Activity 完成為止。 若為 true,則自動從概覽螢幕中移除任務。 它會替換呼叫方使用的 FLAG_ACTIVITY_RETAIN_IN_RECENTS。 它必須是布林值“true”或“false”。

*android:banner*

一種為其關聯項提供擴充套件圖形化橫幅的可繪製資源。 將其與 <activity> 標記聯用可為特定 Activity 提供預設橫幅,也可與 <application> 標記聯用,為所有應用 Activity 提供橫幅。
系統使用橫幅在 Android TV 主螢幕中表示應用。 由於橫幅只顯示在主螢幕中,因此只應由包含的 Activity 能夠處理 CATEGORY_LEANBACK_LAUNCHER Intent 的應用指定。

必須將該屬性設定為對包含影象的可繪製資源的引用(例如 "@drawable/banner")。 沒有預設橫幅。

如需瞭解詳細資訊,請參閱“面向電視的 UI 模式”設計指南中的橫幅,以及“電視應用入門指南”中的提供主螢幕橫幅。

*android:clearTaskOnLaunch*

是否每當從主螢幕重新啟動任務時都從中移除根 Activity 之外的所有 Activity —“true”表示始終將任務清除到只剩其根 Activity;“false”表示不做清除。 預設值為“false”。該屬性只對啟動新任務的 Activity(根 Activity)有意義;對於任務中的所有其他 Activity,均忽略該屬性。
當值為“true”時,每次使用者再次啟動任務時,無論使用者最後在任務中正在執行哪個 Activity,也無論使用者是使用返回還是主螢幕按鈕離開,都會將使用者轉至任務的根 Activity。 當值為“false”時,可在某些情況下清除任務中的 Activity(請參閱 alwaysRetainTaskState 屬性),但並非一律可以。

例如,假定有人從主螢幕啟動了 Activity P,然後從那裡轉到 Activity Q。該使用者接著按了主螢幕按鈕,然後返回到 Activity P。正常情況下,使用者將看到 Activity Q,因為那是其最後在 P 的任務中執行的 Activity。 不過,如果 P 將此標誌設定為“true”,則當用戶按下主螢幕將任務轉入後臺時,其上的所有 Activity(在本例中為 Q)都會被移除。 因此使用者返回任務時只會看到 P。

如果該屬性和 allowTaskReparenting 的值均為“true”,則如上所述,任何可以更改父項的 Activity 都將轉移到與其有親和關係的任務;其餘 Activity 隨即被移除。

*android:configChanges*

列出 Activity 將自行處理的配置更改。在執行時發生配置更改時,預設情況下會關閉 Activity 然後將其重新啟動,但使用該屬性宣告配置將阻止 Activity 重新啟動。 Activity 反而會保持執行狀態,並且系統會呼叫其 onConfigurationChanged() 方法。
注:應避免使用該屬性,並且只應在萬不得已的情況下使用。 如需瞭解有關如何正確處理配置更改所致重新啟動的詳細資訊,請閱讀處理執行時變更。

任何或所有下列字串均是該屬性的有效值。多個值使用“|”分隔 — 例如,“locale|navigation|orientation”。

值   說明
“mcc”   IMSI 移動國家/地區程式碼 (MCC) 發生了變化 - 檢測到了 SIM 並更新了 MCC。
“mnc”   IMSI 行動網路程式碼 (MNC) 發生了變化 - 檢測到了 SIM 並更新了 MNC。
“locale”    語言區域發生了變化 — 使用者為文字選擇了新的顯示語言。
“touchscreen”   觸控式螢幕發生了變化。(這種情況通常永遠不會發生。)
“keyboard”  鍵盤型別發生了變化 — 例如,使用者插入了一個外接鍵盤。
“keyboardHidden”    鍵盤無障礙功能發生了變化 — 例如,使用者顯示了硬體鍵盤。
“navigation”    導航型別(軌跡球/方向鍵)發生了變化。(這種情況通常永遠不會發生。)
“screenLayout”  屏幕布局發生了變化 — 這可能是由激活了其他顯示方式所致。
“fontScale” 字型縮放係數發生了變化 — 使用者選擇了新的全域性字號。
“uiMode”    使用者介面模式發生了變化 — 這可能是因使用者將裝置放入桌面/車載基座或夜間模式發生變化所致。 請參閱 UiModeManager。 此項為 API 級別 8 中新增配置。
“orientation”   螢幕方向發生了變化 — 使用者旋轉了裝置。
注:如果您的應用面向 API 級別 13 或更高級別(按照 minSdkVersion 和 targetSdkVersion 屬性所宣告的級別),則還應宣告 "screenSize" 配置,因為當裝置在橫向與縱向之間切換時,該配置也會發生變化。

“screenSize”    當前可用螢幕尺寸發生了變化。它表示當前可用尺寸相對於當前縱橫比的變化,因此會在使用者在橫向與縱向之間切換時發生變化。 不過,如果您的應用面向 API 級別 12 或更低級別,則 Activity 始終會自行處理此配置變更(即便是在 Android 3.2 或更高版本的裝置上執行,此配置變更也不會重新啟動 Activity)。
此項為 API 級別 13 中新增配置。
“smallestScreenSize”    物理螢幕尺寸發生了變化。它表示與方向無關的尺寸變化,因此只有在實際物理螢幕尺寸發生變化(如切換到外部顯示器)時才會變化。 對此配置的變更對應於smallestWidth 配置的變化。 不過,如果您的應用面向 API 級別 12 或更低級別,則 Activity 始終會自行處理此配置變更(即便是在 Android 3.2 或更高版本的裝置上執行,此配置變更也不會重新啟動 Activity)。
此項為 API 級別 13 中新增配置。
“layoutDirection”   佈局方向發生了變化。例如,從從左至右 (LTR) 更改為從右至左 (RTL)。 此項為 API 級別 17 中新增配置。
所有這些配置變更都可能影響應用看到的資源值。 因此,呼叫 onConfigurationChanged() 時,通常有必要再次獲取所有資源(包括檢視佈局、可繪製物件等),以正確處理變化。

*android:documentLaunchMode*

指定每次啟動任務時應如何向其中新增新的 Activity 例項。 該屬性允許使用者讓多個來自同一應用的文件出現在概覽螢幕中。
該屬性有四個值,會在使用者使用該應用開啟文件時產生以下效果:

值   說明
“intoExisting”  Activity 會為文件重複使用現有任務。使用該值與不設定 FLAG_ACTIVITY_MULTIPLE_TASK 標誌、但設定 FLAG_ACTIVITY_NEW_DOCUMENT 標誌所產生的效果相同,如使用 Intent 標誌新增任務中所述。
“always”    Activity 為文件建立新任務,即便文件已開啟也是如此。 這與同時設定 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 標誌的效果相同。
“none”  該 Activity 不會為 Activity 建立新任務。這是預設值,它只會在設定了 FLAG_ACTIVITY_NEW_TASK 時建立新任務。 概覽螢幕將按其預設方式對待此 Activity:為應用顯示單個任務,該任務將從使用者上次呼叫的任意 Activity 開始繼續執行。
“never” 即使 Intent 包含 FLAG_ACTIVITY_NEW_DOCUMENT,該 Activity 也不會啟動到新文件之中。 設定此值會替代 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 標誌的行為(如果在 Activity 中設定了其中一個標誌),並且概覽螢幕將為應用顯示單個任務,該任務將從使用者上次呼叫的任意 Activity 開始繼續執行。
注:對於除“none”和“never”以外的值,必須使用 launchMode="standard" 定義 Activity。 如果未指定此屬性,則使用 documentLaunchMode="none"。

*android:enabled*

系統是否可將 Activity 例項化 — "true" 表示可以,“false”表示不可以。 預設值為“true”。
<application> 元素具有自己的 enabled 屬性,該屬性適用於所有應用元件,包括 Activity。 <application> 和 <activity> 屬性必須都是“true”(因為它們都預設使用該值),系統才能將 Activity 例項化。 如果任何一個屬性是“false”,則無法進行例項化。

*android:excludeFromRecents*

是否應將該 Activity 啟動的任務排除在最近使用的應用列表(即概覽螢幕)之外。 也就是說,當該 Activity 是新任務的根 Activity 時,此屬性確定任務是否應出現在最近使用的應用列表中。 如果應將任務排除在列表之外,請設定“true”;如果應將其包括在內,則設定“false”。 預設值為“false”。

*android:exported*

Activity 是否可由其他應用的元件啟動 —“true”表示可以,“false”表示不可以。若為“false”,則 Activity 只能由同一應用的元件或使用同一使用者 ID 的不同應用啟動。
預設值取決於 Activity 是否包含 Intent 過濾器。沒有任何過濾器意味著 Activity 只能通過指定其確切的類名稱進行呼叫。 這意味著 Activity 專供應用內部使用(因為其他應用不知曉其類名稱)。 因此,在這種情況下,預設值為“false”。另一方面,至少存在一個過濾器意味著 Activity 專供外部使用,因此預設值為“true”。

該屬性並非限制 Activity 對其他應用開放度的唯一手段。 您還可以利用許可權來限制哪些外部實體可以呼叫 Activity(請參閱 permission 屬性)。

*android:finishOnTaskLaunch*

每當使用者再次啟動其任務(在主螢幕上選擇任務)時,是否應關閉(完成)現有 Activity 例項 —“true”表示應關閉,“false”表示不應關閉。 預設值為“false”。
如果該屬性和 allowTaskReparenting 均為“true”,則優先使用該屬性。 Activity 的親和關係會被忽略。 系統不是更改 Activity 的父項,而是將其銷燬。

*android:hardwareAccelerated*

是否應為此 Activity 啟用硬體加速渲染 —“true”表示應啟用,“false”表示不應啟用。 預設值為“false”。
從 Android 3.0 開始,為應用提供了硬體加速 OpenGL 渲染器,以改善許多常見 2D 圖形運算的效能。 啟用硬體加速渲染器時,Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的大多數運算都會得到加速。這可以提高動畫、滾動的流暢度和總體響應速度,即便是並不明確使用框架 OpenGL 庫的應用也會受益。 由於啟用硬體加速會增加資源消耗,因此您的應用將佔用更多記憶體。

請注意,並非所有 OpenGL 2D 運算都會得到加速。如果您啟用硬體加速渲染器,請對應用進行測試,以確保其在利用渲染器時不會出錯。

*android:icon*

一個表示 Activity 的圖示。該圖示會在需要在螢幕上表示 Activity 時顯示給使用者。 例如,代表啟動任務的 Activity 的圖示顯示在啟動器視窗中。該圖示通常附帶標籤(請參閱 android:label 屬性)。
必須將該屬性設定為對包含影象定義的可繪製資源的引用。 如果未設定該屬性,則改為使用為應用整體指定的圖示(請參閱 <application> 元素的 icon 屬性)。

這個 Activity 的圖示 — 無論設置於此處還是由 <application> 元素設定 — 同時也是 Activity 所有 Intent 過濾器的預設圖示(請參閱 <intent-filter> 元素的 icon 屬性)。

*android:label*

一種可由使用者讀取的 Activity 標籤。該標籤會在必須將 Activity 呈現給使用者時顯示在螢幕上。 它通常與 Activity 圖示一併顯示。
如果未設定該屬性,則改為使用為應用整體設定的標籤(請參閱 <application> 元素的 label 屬性)。

這個 Activity 的標籤 — 無論設置於此處還是由 <application> 元素設定 — 同時也是 Activity 所有 Intent 過濾器的預設標籤(請參閱 <intent-filter> 元素的 label 屬性)。

應將該標籤設定為對字串資源的引用,以便可以像使用者介面中的其他字串那樣進行本地化。不過,為便於您開發應用,也可將其設定為原始字串。

*android:launchMode*

有關應如何啟動 Activity 的指令。共有四種模式與 Intent 物件中的 Activity 標誌(FLAG_ACTIVITY_* 常量)協同工作,以確定在呼叫 Activity 處理 Intent 時應執行的操作。 這些模式是:
“standard” 
“singleTop” 
“singleTask” 
“singleInstance”

預設模式是“standard”。

如下表所示,這些模式分為兩大類,“standard”和“singleTop”Activity 為一類,“singleTask”和“singleInstance”為另一類。使用“standard”或“singleTop”啟動模式的 Activity 可多次例項化。 例項可歸屬任何任務,並且可以位於 Activity 堆疊中的任何位置。 它們通常啟動到名為 startActivity() 的任務之中(除非 Intent 物件包含 FLAG_ACTIVITY_NEW_TASK 指令,在此情況下會選擇其他任務 — 請參閱 taskAffinity 屬性)。

相比之下,“singleTask”和“singleInstance”Activity 只能啟動任務。 它們始終位於 Activity 堆疊的根位置。此外,裝置一次只能保留一個 Activity 例項 — 只允許一個此類任務。

“standard”和“singleTop”模式只在一個方面有差異: 每次“standard”Activity 有新的 Intent 時,系統都會建立新的類例項來響應該 Intent。每個例項處理單個 Intent。同理,也可建立新的“singleTop”Activity 例項來處理新的 Intent。 不過,如果目標任務在其堆疊頂部已有一個 Activity 例項,那麼該例項將接收新 Intent(通過呼叫 onNewIntent());此時不會建立新例項。在其他情況下 — 例如,如果“singleTop”的一個現有例項雖在目標任務內,但未處於堆疊頂部,或者雖然位於堆疊頂部,但不在目標任務中 — 則系統會建立一個新例項並將其推送到堆疊上。

同理,如果您向上導航到當前堆疊上的某個 Activity,該行為由父 Activity 的啟動模式決定。 如果父 Activity 有啟動模式 singleTop(或 up Intent 包含 FLAG_ACTIVITY_CLEAR_TOP),則系統會將該父項置於堆疊頂部,並保留其狀態。 導航 Intent 由父 Activity 的 onNewIntent() 方法接收。 如果父 Activity 有啟動模式 standard(並且 up Intent 不包含 FLAG_ACTIVITY_CLEAR_TOP),則系統會將當前 Activity 及其父項同時彈出堆疊,並建立一個新的父 Activity 例項來接收導航 Intent。

“singleTask”和“singleInstance”模式同樣只在一個方面有差異: “singleTask”Activity 允許其他 Activity 成為其任務的組成部分。 它始終位於其任務的根位置,但其他 Activity(必然是“standard”和“singleTop”Activity)可以啟動到該任務中。 相反,“singleInstance”Activity 則不允許其他 Activity 成為其任務的組成部分。它是任務中唯一的 Activity。 如果它啟動另一個 Activity,系統會將該 Activity 分配給其他任務 — 就好像 Intent 中包含 FLAG_ACTIVITY_NEW_TASK 一樣。

用例  啟動模式    多個例項?   註釋
大多數 Activity 的正常啟動  “standard”  是   預設值。系統始終會在目標任務中建立新的 Activity 例項並向其傳送 Intent。
“singleTop” 有條件 如果目標任務的頂部已存在一個 Activity 例項,則系統會通過呼叫該例項的 onNewIntent() 方法向其傳送 Intent,而不是建立新的 Activity 例項。
專用啟動
(不建議用作常規用途) “singleTask”    否   系統在新任務的根位置建立 Activity 並向其傳送 Intent。 不過,如果已存在一個 Activity 例項,則系統會通過呼叫該例項的 onNewIntent() 方法向其傳送 Intent,而不是建立新的 Activity 例項。
“singleInstance”    否   與“singleTask"”相同,只是系統不會將任何其他 Activity 啟動到包含例項的任務中。 該 Activity 始終是其任務唯一僅有的成員。
如上表所示,standard 是預設模式,並且適用於大多數的 Activity 型別。對許多型別的 Activity 而言,SingleTop 也是一個常見並且有用的啟動模式。 其他模式 — singleTask 和 singleInstance - 不適合 大多數應用因為它們所形成的互動模式可能讓使用者感到陌生,並且與大多數其他應用迥異。

無論您選擇哪一種啟動模式,請務必在啟動期間以及使用返回按鈕從其他 Activity 和任務返回該 Activity 時對其進行易用性測試。

如需瞭解有關啟動模式及其與 Intent 標誌互動的詳細資訊,請參閱任務和返回棧文件。

*android:maxRecents*

概覽螢幕中位於此 Activity 根位置的任務數上限。 達到該條目數時,系統會從概覽螢幕中移除最近最少使用的例項。 有效值為 1-50(低記憶體裝置使用 25);0 為無效值。 該值必須是整數,例如 50。預設值為 16。

*android:multiprocess*

是否可以將 Activity 例項啟動到啟動該例項的元件程序內 —“true”表示可以,“false”表示不可以。預設值為“false”。
正常情況下,新的 Activity 例項會啟動到定義它的應用程序內,因此所有 Activity 例項都在同一程序內執行。 不過,如果該標誌設定為“true”,Activity 例項便可在多個程序內執行,這樣系統就能在任何使用例項的地方建立例項(前提是許可權允許這樣做),但這幾乎毫無必要性或可取之處。

*android:name*

實現 Activity 的類的名稱,是 Activity 的子類。 該屬性值應為完全限定類名稱(例如,“com.example.project.ExtracurricularActivity”)。不過,為了簡便起見,如果名稱的第一個字元是句點(例如,“.ExtracurricularActivity”),則名稱將追加到 <manifest> 元素中指定的軟體包名稱。
應用一旦釋出,即不應更改該名稱(除非您設定了 android:exported="false")。

沒有預設值。必須指定該名稱。

*android:noHistory*

當用戶離開 Activity 並且其在螢幕上不再可見時,是否應從 Activity 堆疊中將其移除並完成(呼叫其 finish() 方法)—“true”表示應將其完成,“false”表示不應將其完成。 預設值為“false”。
“true”一值表示 Activity 不會留下歷史軌跡。 它不會留在任務的 Activity 堆疊內,因此使用者將無法返回 Activity。 在此情況下,如果您啟動另一個 Activity 來獲取該 Activity 的結果,系統永遠不會呼叫 onActivityResult()。

該屬性是在 API 級別 3 引入的。

*android:parentActivityName*

Activity 邏輯父項的類名稱。此處的名稱必須與為相應 <activity> 元素的 android:name 屬性指定的類名稱一致。
系統會讀取該屬性,以確定當用戶按下操作欄中的“向上”按鈕時應該啟動哪一個 Activity。 系統還可以利用這些資訊通過 TaskStackBuilder 合成 Activity 的返回棧。

要支援 API 級別 4 - 16,您還可以使用為 "android.support.PARENT_ACTIVITY" 指定值的 <meta-data> 元素來宣告父 Activity。例如:

如需瞭解有關宣告父 Activity 以支援向上導航的詳細資訊,請閱讀提供向上導航。

該屬性是在 API 級別 16 引入的。

*android:permission*

客戶端啟動 Activity 或以其他方式令其響應 Intent 而必須具備的許可權的名稱。 如果系統尚未向 startActivity() 或 startActivityForResult() 的呼叫方授予指定許可權,其 Intent 將不會傳遞給 Activity。
如果未設定該屬性,則對 Activity 應用 <application> 元素的 permission 屬性設定的許可權。 如果這兩個屬性均未設定,則 Activity 不受許可權保護。

如需瞭解有關許可權的詳細資訊,請參閱簡介的許可權一節和另一份文件安全與許可權。

*android:process*

應在其中執行 Activity 的程序的名稱。正常情況下,應用的所有元件都在為應用建立的預設程序名稱內執行,您無需使用該屬性。 但在必要時,您可以使用該屬性替換預設程序名稱,以便讓應用元件散佈到多個程序中。
如果為該屬性分配的名稱以冒號(“:”)開頭,則會在需要時建立應用專用的新程序,並且 Activity 會在該程序中執行。如果程序名稱以小寫字元開頭,Activity 將在該名稱的全域性程序中執行,前提是它擁有相應的許可權。這可以讓不同應用中的元件共享一個程序,從而減少資源佔用。

<application> 元素的 process 屬性可為所有元件設定一個不同的預設程序名稱。

*android:relinquishTaskIdentity*

Activity 是否將其任務識別符號交給任務棧中在其之上的 Activity。 如果任務根 Activity 的該屬性設定為“true”,則任務會用其內的下一個 Activity 的 Intent 替換基本 Intent。 如果下一個 Activity 的該屬性也設定為“true”,則該 Activity 會將基本 Intent 給予其在同一任務中啟動的任何 Activity。 系統繼續為每個 Activity 執行此過程,直至遇到的某個 Activity 將該屬性設定為“false”為止。 預設值為“false”。
如果該屬性設定為“true”,則 Activity 還可利用 ActivityManager.TaskDescription 來更改概覽螢幕中的標籤、顏色和圖示。

*resizeableActivity*

指定應用是否支援多視窗顯示。您可以在 <activity> 或 <application> 元素中設定該屬性。

如果您將該屬性設定為 true,則使用者可以分屏和自由形狀模式啟動 Activity。 如果您將該屬性設定為 false,Activity 將不支援多視窗模式。 如果該值為 false,且使用者嘗試在多視窗模式下啟動 Activity,該 Activity 將全屏顯示。

如果您的應用面向 API 級別 24 或更高級別,但未對該屬性指定值,則該屬性的值預設設為 true。

該屬性是在 API 級別 24 新增的。

*android:screenOrientation*

Activity 在裝置上的顯示方向。如果 Activity 是在多視窗模式下執行,系統會忽略該屬性。
其值可以是下列任一字串:

“unspecified”   預設值。由系統選擇方向。在不同裝置上,系統使用的政策以及基於政策在特定上下文所做的選擇可能有所差異。
“behind”    與 Activity 棧中緊接著它的 Activity 的方向相同。
“landscape” 橫向方向(顯示的寬度大於高度)。
“portrait”  縱向方向(顯示的高度大於寬度)。
“reverseLandscape”  與正常橫向方向相反的橫向方向。API 級別 9 中的新增配置。
“reversePortrait”   與正常縱向方向相反的縱向方向。API 級別 9 中的新增配置。
“sensorLandscape”   橫向方向,但根據裝置感測器,可以是正常或反向的橫向方向。API 級別 9 中的新增配置。
“sensorPortrait”    縱向方向,但根據裝置感測器,可以是正常或反向的縱向方向。API 級別 9 中的新增配置。
“userLandscape” 橫向方向,但根據裝置感測器和使用者的感測器首選項,可以是正常或反向的橫向方向。 如果使用者鎖定了基於感測器的旋轉,其行為與 landscape 相同,否則,其行為與 sensorLandscape 相同。API 級別 18 中的新增配置。
“userPortrait”  縱向方向,但根據裝置感測器和使用者的感測器首選項,可以是正常或反向的縱向方向。 如果使用者鎖定了基於感測器的旋轉,其行為與 portrait 相同,否則,其行為與 sensorPortrait 相同。API 級別 18 中的新增配置。
“sensor”    方向由裝置方向感測器決定。顯示方向取決於使用者如何手持裝置,它會在使用者旋轉裝置時發生變化。 但一些裝置預設情況下不會旋轉到所有四種可能的方向。要允許全部四種方向,請使用 "fullSensor"。
“fullSensor”    方向由 4 種方向中任一方向的裝置方向感測器決定。這與 "sensor" 類似,不同的是它允許所有 4 種可能的螢幕方向,無論裝置正常情況下采用什麼方向(例如,一些裝置正常情況下不使用反向縱向或反向橫向,但它支援這些方向)。 API 級別 9 中的新增配置。
“nosensor”  決定方向時不考慮物理方向感測器。感測器會被忽略,因此顯示不會隨使用者對裝置的移動而旋轉。 除了這個區別,系統在選擇方向時使用的政策與“unspecified”設定相同。
“user”  使用者當前的首選方向。
"fullUser"  如果使用者鎖定了基於感測器的旋轉,其行為與 user 相同,否則,其行為與 fullSensor 相同,允許所有 4 種可能的螢幕方向。 API 級別 18 中的新增配置。
“locked”    將方向鎖定在其當前的任意旋轉方向。API 級別 18 中的新增配置。
注:如果您宣告其中一個橫向或縱向值,系統將其視為對 Activity 執行方向的硬性要求。 因此,您宣告的值支援通過 Google Play 之類的服務進行過濾,這樣就能將您的應用只提供給支援 Activity 所要求方向的裝置。 例如,如果您聲明瞭 "landscape""reverseLandscape""sensorLandscape",則您的應用將只提供給支援橫向方向的裝置。 不過,您還應通過 <uses-feature> 元素明確宣告,您的應用要求採用縱向或橫向方向。 例如,<uses-feature android:name="android.hardware.screen.portrait"/>。這純粹是 Google Play(以及其他支援它的服務)提供的一種過濾行為,平臺本身並不能控制當裝置僅支援特定方向時您的應用能否安裝。

*android:stateNotNeeded*

能否在不儲存 Activity 狀態的情況下將其終止併成功重新啟動 —“true”表示可在不考慮其之前狀態的情況下重新啟動,“false”表示需要之前狀態。 預設值為“false”。
正常情況下,為儲存資源而暫時關閉 Activity 前,系統會呼叫其 onSaveInstanceState() 方法。 該方法將 Activity 的當前狀態儲存在一個 Bundle 物件中,然後在 Activity 重新啟動時將其傳遞給 onCreate()。 如果該屬性設定為“true”,系統可能不會呼叫 onSaveInstanceState(),並且會向 onCreate() 傳遞 null 而不是 Bundle - 這與它在 Activity 首次啟動時完全一樣。

“true”設定可確保 Activity 能夠在未保留狀態時重新啟動。 例如,顯示主螢幕的 Activity 可以使用該設定來確保其由於某種原因崩潰時不會被移除。

*supportsPictureInPicture*

指定 Activity 是否支援畫中畫 顯示。如果 android:resizeableActivity 是 false,系統會忽略該屬性。

該屬性是在 API 級別 24 新增的。

*android:taskAffinity*

與 Activity 有著親和關係的任務。從概念上講,具有相同親和關係的 Activity 歸屬同一任務(從使用者的角度來看,則是歸屬同一“應用”)。 任務的親和關係由其根 Activity 的親和關係確定。
親和關係確定兩件事 - Activity 更改到的父項任務(請參閱 allowTaskReparenting 屬性)和通過 FLAG_ACTIVITY_NEW_TASK 標誌啟動 Activity 時將用來容納它的任務。

預設情況下,應用中的所有 Activity 都具有相同的親和關係。您可以設定該屬性來以不同方式組合它們,甚至可以將在不同應用中定義的 Activity 置於同一任務內。 要指定 Activity 與任何任務均無親和關係,請將其設定為空字串。

如果未設定該屬性,則 Activity 繼承為應用設定的親和關係(請參閱 <application> 元素的 taskAffinity 屬性)。 應用預設親和關係的名稱是 <manifest> 元素設定的軟體包名稱。

*android:theme*

對定義 Activity 總體主題的樣式資源的引用。它會自動將 Activity 的上下文設定為使用該主題(請參閱 setTheme()),它還可以引發 Activity 啟動前的“啟動”動畫(以更加符合 Activity 的實際外觀)。
如果未設定該屬性,則 Activity 繼承通過 <application> 元素的 theme 屬性為應用整體設定的主題。 如果該屬性也未設定,則使用預設系統主題。如需瞭解詳細資訊,請參閱樣式和主題開發者指南。

*android:uiOptions*

針對 Activity UI 的附加選項。
必須是下列值之一。

值   說明
"none"  無附加 UI 選項。這是預設值。
"splitActionBarWhenNarrow"  當水平空間受限時(例如在手持裝置上的縱向模式下時)在螢幕底部新增一個欄以顯示應用欄(也稱為操作欄)中的操作項)。 應用欄不是以少量操作項形式出現在螢幕頂部的應用欄中,而是分成了頂部導航區和底部操作項欄。 這可以確保操作項以及頂部的導航和標題元素都能獲得合理的空間。 選單項不會拆分到兩個欄中,它們始終一起出現。
如需瞭解有關應用欄的詳細資訊,請參閱新增應用欄培訓課。

該屬性是在 API 級別 14 新增的。

*android:windowSoftInputMode*

Activity 的主視窗與包含螢幕軟鍵盤的視窗的互動方式。 該屬性的設定影響兩個方面:
當 Activity 成為使用者注意的焦點時軟鍵盤的狀態 — 隱藏還是可見。
對 Activity 主視窗所做的調整 — 是否將其尺寸調小以為軟鍵盤騰出空間,或者當視窗部分被軟鍵盤遮擋時是否平移其內容以使當前焦點可見。
該設定必須是下表所列的值之一,或者是一個“state...”值加上一個“adjust...”值的組合。 在任一組中設定多個值(例如,多個“state...”值)都會產生未定義結果。各值之間使用垂直條 (|) 分隔。 例如:

<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
此處設定的值(“stateUnspecified”和“adjustUnspecified”除外)替換主題中設定的值。

值   說明
"stateUnspecified"  不指定軟鍵盤的狀態(隱藏還是可見)。 將由系統選擇合適的狀態,或依賴主題中的設定。
這是對軟鍵盤行為的預設設定。
“stateUnchanged”    當 Activity 轉至前臺時保留軟鍵盤最後所處的任何狀態,無論是可見還是隱藏。
“stateHidden”   當用戶選擇 Activity 時 — 也就是說,當用戶確實是向前導航到 Activity,而不是因離開另一 Activity 而返回時 — 隱藏軟鍵盤。
“stateAlwaysHidden” 當 Activity 的主視窗有輸入焦點時始終隱藏軟鍵盤。
“stateVisible”  在正常的適宜情況下(當用戶向前導航到 Activity 的主視窗時)顯示軟鍵盤。
“stateAlwaysVisible”    當用戶選擇 Activity 時 — 也就是說,當用戶確實是向前導航到 Activity,而不是因離開另一 Activity 而返回時 — 顯示軟鍵盤。
“adjustUnspecified” 不指定 Activity 的主視窗是否調整尺寸以為軟鍵盤騰出空間,或者視窗內容是否進行平移以在螢幕上顯露當前焦點。 系統會根據視窗的內容是否存在任何可滾動其內容的佈局檢視來自動選擇其中一種模式。 如果存在這樣的檢視,視窗將進行尺寸調整,前提是可通過滾動在較小區域內看到視窗的所有內容。
這是對主視窗行為的預設設定。
“adjustResize”  始終調整 Activity 主視窗的尺寸來為螢幕上的軟鍵盤騰出空間。
“adjustPan” 不調整 Activity 主視窗的尺寸來為軟鍵盤騰出空間, 而是自動平移視窗的內容,使當前焦點永遠不被鍵盤遮蓋,讓使用者始終都能看到其輸入的內容。 這通常不如尺寸調正可取,因為使用者可能需要關閉軟鍵盤以到達被遮蓋的視窗部分或與這些部分進行互動。
該屬性是在 API 級別 3 引入的。

引入的版本:
API 級別 1,為 noHistory 和 windowSoftInputMode 之外的所有屬性引入,這兩個屬性則是在 API 級別 3 中增加。

Service:

<service android:description="string resource"
         android:directBootAware=["true" | "false"]
         android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:icon="drawable resource"
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
    . . .
</service>

CONTAINED IN:
<application>
CAN CONTAIN:
<intent-filter> 
<meta-data>

receiver

<receiver android:directBootAware=["true" | "false"]
          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>

CONTAINED IN:
<application>
CAN CONTAIN:
<intent-filter> 
<meta-data>

provider

<provider android:authorities="list"
          android:directBootAware=["true" | "false"]
          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>

CONTAINED IN:
<application>
CAN CONTAIN:
<meta-data> 
<grant-uri-permission> 
<path-permission>

intent-filter
過濾器,跳轉依據

<intent-filter android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
               <action android:name="string" />
               <category android:name="string" />
               <data android:scheme="string"
              android:host="string"
              android:port="string"
              android:path="string"
              android:pathPattern="string"
              android:pathPrefix="string"
              android:mimeType="string" />

</intent-filter>

icon:顯示圖示
label:顯示名稱
priority:優先順序
action:必須要與,可多個,Intent物件建立的時候需要action引數
category:類別,可選,可多個
data:URI等引數設定

meta-data
為四大元件提供額外的值,可多個

<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string" />

grant-uri-permission

<grant-uri-permission android:path="string"
                      android:pathPattern="string"
                      android:pathPrefix="string" />

path-permission

<path-permission android:path="string"
                 and