AndroidManifest.xml文件--Activity標簽詳解

android:allowEmbedded

android:allowEmbedded=["true" | "false"]  
這個標識一般為開發可穿戴設備時使用,表示該 Activity 可作為另一 Activity 的嵌入式子項啟動。 它尤其適用于子項所在的容器(如 Display)為另一 Activity 所擁有的情況。 例如,用于 Wear 自定義通知的 Activity 必須聲明此項,以便 Wear 在其上下文流中顯示 Activity,后者位于另一進程中。該屬性的默認值為false

android:allowTaskReparenting

android:allowTaskReparenting=["true" | "false"]  
這個標示和 Application 的標識意義一樣,所以如果同時聲明該標識,這個標識會覆蓋 Application 的標識,

android:alwaysRetainTaskState

android:alwaysRetainTaskState=["true" | "false"]  
這個標識用來指示系統是否始終保持 Activity 所在任務的狀態 true表示保持,false表示允許系統在特定情況下將任務重置到其初始狀態。 默認值為false。該屬性只對任務的根 Activity 有意義;對于所有其他 Activity,均忽略該屬性。  
正常情況下,當用戶從主屏幕重新選擇某個任務時,系統會在特定情況下清除該任務(從根 Activity 之上的堆棧中移除所有 Activity)。 系統通常會在用戶一段時間(如 30 分鐘)內未訪問任務時執行此操作。  
不過,如果該屬性的值是“true”,則無論用戶如何到達任務,將始終返回到最后狀態的任務。 例如,在網絡瀏覽器這類存在大量用戶不愿失去的狀態(如多個打開的標簽)的應用中,該屬性會很有用。  
這個有點抽象,舉個例子,打開客戶端的順序是 SplashActivity --> GuideActivity --> MainActivity(歡迎頁面 --> 功能引導頁面 --> 主頁面),那么,它在任務棧中就是:
  

由于我們在 Androidmanifest.xml 文件中,給 SplashActivity 設置 android:alwaysRetainTaskState=true,當我們按 HOME 鍵返回桌面,任務棧的狀態被保留著,當我們點擊應用圖標打開再次應用時,系統會判斷是否已經存在以 SplashActivity 為根 Activity 的棧,如果有,那么就直接使用該棧,并顯示棧頂的 Activity。注意,只需要設置根 Activity 就可以了。

android:autoRemoveFromRecents

android:autoRemoveFromRecents=["true" | "false"]  
這個標識為 API21 版本添加,由具有該屬性的 Activity 啟動的任務是否一直保留在概覽屏幕中,直至任務中的最后一個 Activity 完成為止。 若為 true,則自動從概覽屏幕中移除任務。 它會替換調用方使用的 FLAG_ACTIVITY_RETAIN_IN_RECENTS。 它必須是布爾值“true”或“false”。

android:banner

android:banner="drawable resource"  
這個和 application 里面的 banner 標識一樣,也是用在 android TV 上的,在這里也不詳細介紹了,可以去看看 google 官方文檔

android:clearTaskOnLaunch

android:clearTaskOnLaunch=["true" | "false"] 
這個標識用來指明當應用從主屏幕重新啟動時是否都從中移除除根 Activity 之外的所有 Activity,true 表示始終將任務清除到只剩其根 Activity,false 表示不清除,默認值為 false。需要注意的是該屬性只對啟動新任務的 Activity(根 Activity)有意義;對于任務中的所有其他 Activity,均忽略該屬性。當值為“false”時,可在某些情況下清除任務中的 Activity(參考結合 alwaysRetainTaskState 屬性),但并非一律可以。如果該屬性和 allowTaskReparenting 的值均為“true”,則如上所述,任何可以更改父項的 Activity 都將轉移到與其有親和關系的任務;其余 Activity 隨即被移除。

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

android:configChanges

android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale",
"uiMode", "orientation", "screenSize",
"smallestScreenSize"]
  • "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() 時,通常有必要再次獲取所有資源(包括視圖布局、可繪制對象等),以正確處理變化。  
我們平常接觸到最多的就是屏幕的旋轉,屏幕的旋轉如果在沒有特殊設置的情況下會銷毀當前的 Activity 重新創建一個新的,為了避免創建新的,就可以在 AndroidMainfest.xml 中對指定 Activity 對應的 <activity> 配置android:configChanges="orientation",這樣,每次旋轉方向時,只有 onConfigurationChanged 方法被調用,沒有了銷毀重建的過程。

android:documentLaunchMode

android:documentLaunchMode=["intoExisting" | "always" |"none" | "never"]  
指定每次啟動任務時應如何向其中添加新的 Activity 實例。 該屬性允許用戶讓多個來自同一應用的文檔出現在概覽屏幕(recent app)中。該屬性有四個值,會在用戶使用該應用打開文檔時產生以下效果:

Value Description
intoExisting Activity 會為文檔重復使用現有任務。使用該值與不設置FLAG_ACTIVITY_MULTIPLE_TASK 標志、但設置FLAG_ACTIVITY_NEW_DOCUMENT 標志所產生的效果相同,如使用Intent 標志添加任務中所述。
always Activity 為文檔創建新任務,即便文檔已打開也是如此。 這與同時設置FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 標志的效果相同。
none 該 Activity 不會為 Activity 創建新任務。這是默認值,它只會在設置了 FLAG_ACTIVITY_NEW_TASK 時創建新任務。 概覽屏幕將按其默認方式對待此 Activity:為應用顯示單個任務,該任務將從用戶上次調用的任意 Activity 開始繼續執行。
never 即使 Intent 包含 FLAG_ACTIVITY_NEW_DOCUMENT,該 Activity 也不會啟動到新文檔之中。 設置此值會替代 FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 標志的行為(如果在 Activity 中設置了其中一個標志),并且概覽屏幕將為應用顯示單個任務,該任務將從用戶上次調用的任意 Activity 開始繼續執行。

注:對于除“none”和“never”以外的值,必須使用 launchMode="standard" 定義 Activity。 如果未指定此屬性,則使用 documentLaunchMode="none"。感興趣的也可以看看android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity博客中對于FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 標志的介紹。

android:enabled

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

android:excludeFromRecents

android:excludeFromRecents=["true" | "false"] 
 該標識用來標示是否應將該 Activity 啟動的任務排除在最近使用的應用列表(即概覽屏幕)之外。 也就是說,當該 Activity 是新任務的根 Activity 時,此屬性確定任務是否應出現在最近使用的應用列表中。 如果應將任務排除在列表之外,請設置“true”;如果應將其包括在內,則設置“false”。 默認值為“false”。

android:exported

android:exported=["true" | "false"] 
 該標識用來指明Activity 是否可由其他應用的組件啟動 —“true”表示可以,“false”表示不可以。若為“false”,則 Activity 只能由同一應用的組件或使用同一用戶 ID 的不同應用啟動。  需要注意的是該默認值取決于 Activity 是否包含 Intent 過濾器。沒有任何過濾器意味著 Activity 只能通過指定其確切的類名稱進行調用。 這意味著 Activity 專供應用內部使用(因為其他應用不知曉其類名稱)。 因此,在這種情況下,默認值為“false”。另一方面,至少存在一個過濾器意味著 Activity 專供外部使用,因此默認值為“true”。 
 該屬性并非限制 Activity 對其他應用開放度的唯一手段。 您還可以利用權限來限制哪些外部實體可以調用 Activity(請參閱 permission 屬性),具體的也可以看看android permission權限與安全機制解析(上)android permission權限與安全機制解析(下)這兩篇博客,詳細描述了權限的相關。 
 這個標識的使用例子可以參考android IPC通信(上)-sharedUserId&&Messenger

android:finishOnTaskLaunch

android:finishOnTaskLaunch=["true" | "false"]  
該標識用來標示每當用戶再次啟動其任務(在主屏幕上選擇任務)時,是否應關閉(完成)現有 Activity 實例 —“true”表示應關閉,“false”表示不應關閉。 默認值為“false”。如果該屬性和 allowTaskReparenting 均為“true”,則優先使用該屬性。 Activity 的親和關系會被忽略。 系統不是更改 Activity 的父項,而是將其銷毀。

android:hardwareAccelerated

android:hardwareAccelerated=["true" | "false"] 
 該標識用來表明是否應為此 Activity 啟用硬件加速渲染 —“true”表示應啟用,“false”表示不應啟用,默認值為“false”。 
 和 application 的標識不一樣的是,該標示只針對 Activity。 
 從 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 的圖標 — 無論設置于此處還是由 <application> 元素設置 — 同時也是 Activity 所有 Intent 過濾器的默認圖標(請參閱 <intent-filter> 元素的 icon 屬性)。

android:label

android:label="string resource" 
 一種可由用戶讀取的 Activity 標簽。該標簽會在必須將 Activity 呈現給用戶時顯示在屏幕上。 它通常與 Activity 圖標一并顯示。如果未設置該屬性,則改為使用為應用整體設置的標簽(請參閱 <application> 元素的 label 屬性),activity 的該屬性會覆蓋 application 的該屬性。  這個 Activity 的標簽 — 無論設置于此處還是由 <application> 元素設置 — 同時也是 Activity 所有 Intent 過濾器的默認標簽(請參閱 <intent-filter> 元素的 label 屬性)。應將該標簽設置為對字符串資源的引用,以便可以像用戶界面中的其他字符串那樣進行本地化。不過,為便于開發應用,也可將其設置為原始字符串。

android:launchMode

android:launchMode=["standard" | "singleTop" | "singleTask" | "singleInstance"] 詳情請看這篇博客,介紹的非常清楚android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity

android:maxRecents

android:maxRecents="integer" 
 該標識用來指明概覽屏幕中位于此 Activity 根位置的任務數上限。 達到該條目數時,系統會從概覽屏幕中移除最近最少使用的實例。 有效值為 1-50(低內存設備使用 25);0 為無效值。 該值必須是整數,例如 50。默認值為 16。

android:multiprocess

android:multiprocess=["true" | "false"] 
 該標識用來指明是否可以將 Activity 實例啟動到啟動該實例的組件進程內 —“true”表示可以,“false”表示不可以。默認值為“false”。 
 正常情況下,新的 Activity 實例會啟動到定義它的應用進程內,因此所有 Activity 實例都在同一進程內運行。 不過,如果該標志設置為“true”,Activity 實例便可在多個進程內運行,這樣系統就能在任何使用實例的地方創建實例(前提是權限允許這樣做),但是貌似使用的場景和案例不是很多。

android:name

android:name="string" 
 該標識應該不用介紹了,用來指定 Activity 的類的名稱,是 Activity 的子類。 該屬性值應為完全限定類名稱(例如,“com.example.project.DemoActivity”)。不過,為了簡便起見,如果名稱的第一個字符是句點(例如,“.DemoActivity”),則名稱將追加到 <manifest> 元素中指定的軟件包 com.example.project 名稱之后。還有一個需要注意的是,應用一旦發布,即不應更改該名稱(除非您設置了 android:exported="false"),也就是說如果您的 Activity 有讓其他應用使用到,那么最好不要修改名字,因為有可能其他應用是通過顯式的方式指定的 Activity 名字,修改名字可能會造成其他應用無法正常使用甚至崩潰。 
 該標識沒有默認值。必須指定該名稱。

android:noHistory

android:noHistory=["true" | "false"] 
 當用戶離開 Activity 并且其在屏幕上不再可見時,是否應從 Activity 堆棧中將其移除并完成(調用其 finish() 方法)—“true”表示應將其完成,“false”表示不應將其完成。 默認值為“false”。 
 “true”一值表示 Activity 不會留下歷史軌跡。 它不會留在任務的 Activity 堆棧內,因此用戶將無法返回 Activity。 所以有一點需要特別注意的是,在此情況下,如果從這個定義了 noHistory 的 Activity 啟動另一個 Activity 來獲取它的結果,系統永遠不會調用 onActivityResult(),因為此時這個 Activity 已經關閉了。

android:parentActivityName

android:parentActivityName="string" 
 Activity 邏輯父項的類名稱。此處的名稱必須與為相應 <activity> 元素的 android:name 屬性指定的類名稱一致。系統會讀取該屬性,以確定當用戶按下操作欄中的“向上”按鈕時應該啟動哪一個 Activity。 系統還可以利用這些信息通過 TaskStackBuilder 合成 Activity 的返回棧。 
 要支持 API 級別 4 - 16,您還可以使用為 "android.support.PARENT_ACTIVITY" 指定值的 <meta-data> 元素來聲明父 Activity。例如:

<activity
    android:name="com.example.app.ChildActivity"
    android:label="@string/title_child_activity"
    android:parentActivityName="com.example.app.MainActivity" >
    <!-- Parent activity meta-data to support API level 4+ -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app.MainActivity" />
</activity>


關于向上導航的詳細信息,可以看看 Providing Up Navigation,關于用處可以看看:android 特殊用戶通知用法匯總--Notification源碼分析。  該屬性為 API16 版本引入。

android:permission

android:permission="string"  
具體的可以看看android permission權限與安全機制解析(上)android permission權限與安全機制解析(下)

android:process

android:process="string"  
應在其中運行 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 來更改概覽屏幕中的標簽、顏色和圖標。

android:resizeableActivity

android:resizeableActivity=["true" | "false"] 
 這個標識和 <application> 里面的作用一樣,如果在 activity 里面定義的話則代表這個 activity 是否支持分屏模式。如果您將該屬性設置為 true,則用戶可以分屏和自由形狀模式啟動 Activity。 如果您將該屬性設置為 false,Activity 將不支持多窗口模式。 如果該值為 false,且用戶嘗試在多窗口模式下啟動 Activity,該 Activity 將全屏顯示。 
 該屬性是在 API 級別 24 添加的,如果您的應用面向 API 級別 24 或更高級別,但未對該屬性指定值,則該屬性的值默認設為 true。

android:screenOrientation

android:screenOrientation=
["unspecified" | "behind" |"landscape" | "portrait" |"reverseLandscape" | "reversePortrait" 
|"sensorLandscape" | "sensorPortrait" |"userLandscape" | "userPortrait" |"sensor" | 
"fullSensor" | "nosensor" |"user" | "fullUser" | "locked"] 

Activity 在設備上的顯示方向。如果 Activity 是在多窗口模式下運行,系統會忽略該屬性。它的取值可以是如下:

Value Description
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

android:stateNotNeeded=["true" | "false"] 
 該標識用來指明能否在不保存 Activity 狀態的情況下將其終止并成功重新啟動 —“true”表示可在不考慮其之前狀態的情況下重新啟動,“false”表示需要之前狀態,默認值為“false”。一般情況下,為保存資源而暫時關閉 Activity 前,系統會調用 onSaveInstanceState() 方法,該方法將 Activity 的當前狀態存儲在一個 Bundle 對象中,然后在 Activity 重新啟動時將其傳遞給 onCreate() 。如果該屬性設置為 true,系統可能不會調用 onSaveInstanceState(),并且會向 onCreate() 傳遞 null 而不是 Bundle,這樣就與它在 Activity 首次啟動時完全一樣。  這個標識又一個特別有用的地方是,true 設置可確保 Activity 能夠在未保留狀態時重新啟動。 例如,顯示主屏幕的 Activity 可以使用該設置來確保其由于某種原因崩潰時不會被移除。

android:supportsPictureInPicture

android:supportsPictureInPicture=["true" | "false"] 
 指定 Activity 是否支持畫中畫顯示,設置該屬性的同時,需要將 android:resizeableActivity 標識設置為 true,要不然系統會忽略該屬性,可以看到設置完該屬性之后,android TV 就可以實現手機端一個懸浮 activity 的效果,類似于 youtube 。
  所以同樣這個標識和 android:resizeableActivity 一樣都是 API24 版本添加的。

android:taskAffinity

android:taskAffinity="string"  
這個標識用來指明一個 Activity 的親和性,使用方案可以看看我的博客:android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity。從概念上講,具有相同親和關系的 Activity 歸屬同一任務(從用戶的角度來看,則是歸屬同一“應用”)。 任務的親和關系由其根 Activity 的親和關系確定。親和關系確定兩件事 - Activity 更改到的父項任務(請參閱上面提到的 allowTaskReparenting 屬性)和通過 FLAG_ACTIVITY_NEW_TASK 標志啟動 Activity 時將用來容納它的任務。默認情況下,應用中的所有 Activity 都具有相同的親和關系。您可以設置該屬性來以不同方式組合它們,甚至可以將在不同應用中定義的 Activity 置于同一任務內。 要指定 Activity 與任何任務均無親和關系,請將其設置為空字符串。如果未設置該屬性,則 Activity 繼承為應用設置的親和關系(可以參考 <application> 元素的 taskAffinity 屬性),應用默認親和關系的名稱是 <manifest> 元素設置的 packageName。

android:theme

android:theme="resource or theme" 
 這個標識用的應該很多了,用來定義一個 activity 的樣式,為一個資源的引用,它會自動將 Activity 的上下文設置為使用該主題(請參閱 setTheme()),它還可以引發 Activity 啟動前的“啟動”動畫(以更加符合 Activity 的實際外觀)。如果未設置該屬性,則 Activity 繼承通過 application 元素的 theme 屬性為應用整體設置的主題。 如果該屬性也未設置,則使用默認系統主題。具體的可以看一下開發指南:樣式和主題。 
 關于 theme 的實戰可以看看博客:android 自定義狀態欄和導航欄分析與實現

android:uiOptions

android:uiOptions=["none" | "splitActionBarWhenNarrow"] 
 這個標識主要是用來針對 action bar 的,它有兩個值:

  • none
    無附加 UI 選項。這是默認值。

  • splitActionBarWhenNarrow
    當水平空間受限時(例如在手持設備上的縱向模式下時)在屏幕底部添加一個欄以顯示應用欄(也稱為操作欄)中的操作項)。 應用欄不是以少量操作項形式出現在屏幕頂部的應用欄中,而是分成了頂部導航區和底部操作項欄。 這可以確保操作項以及頂部的導航和標題元素都能獲得合理的空間。 菜單項不會拆分到兩個欄中,它們始終一起出現。

該標識為 API14 版本增加,具體的可以查看 action bar 的官方文檔:Adding the App Bar

android:windowSoftInputMode

android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"]

這個標識用來設置 Activity 的主窗口與包含屏幕軟鍵盤的窗口的交互方式,這個屬性的設置影響兩個方面:

  • 當 Activity 成為用戶注意的焦點時軟鍵盤的狀態 — 隱藏還是可見。
  • 對 Activity 主窗口所做的調整 — 是否將其尺寸調小以為軟鍵盤騰出空間,或者當窗口部分被軟鍵盤遮擋時是否平移其內容以使當前焦點可見。

該設置必須是下表所列的值之一,或者是一個“state...”值加上一個“adjust...”值的組合。 在任一組中設置多個值(例如,多個“state...”值)都會產生未定義結果。各值之間使用垂直條 (|) 分隔。 例如:<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
,這個標識可以設置的值如下:

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

adjustResize 和 adjustPan 的區別就在于前者是調整 Activity 的窗口尺寸來達到適配的目的,而 adjustPan 僅僅只是將窗口平移,界面的一部分就會被軟鍵盤覆蓋住,就不會被擠到軟鍵盤之上了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容