Android Activity標簽屬性
?
Activity 是 Android 系統四大應用組件之一,用戶可與 Activity 提供的屏幕進行交互,以執行撥打電話、拍攝照片、發送電子郵件等操作開發者必須在清單文件中聲明要使用的 Activity,這樣系統才能訪問它。聲明方式是在?< application >?元素中添加?< activity >?子元素
1 <application 2 android:allowBackup="true" 3 android:icon="@mipmap/ic_launcher" 4 android:label="@string/app_name" 5 android:supportsRtl="true" 6 android:theme="@style/AppTheme"> 7 8 9 <activity android:name=".Example"> 10 </activity> 11 12 </application>
?
可以為< activity >元素設置多個屬性值以定義 UI 風格或者運行屬性。?android:name?屬性是唯一必需的屬性,用于指定 Activity 的類名
< activity >包含的屬性如下所示
1 <activity android:allowEmbedded=["true" | "false"] 2 android:allowTaskReparenting=["true" | "false"] 3 android:alwaysRetainTaskState=["true" | "false"] 4 android:autoRemoveFromRecents=["true" | "false"] 5 android:banner="drawable resource" 6 android:clearTaskOnLaunch=["true" | "false"] 7 android:configChanges=["mcc", "mnc", "locale", 8 "touchscreen", "keyboard", "keyboardHidden", 9 "navigation", "screenLayout", "fontScale", 10 "uiMode", "orientation", "screenSize", 11 "smallestScreenSize"] 12 android:documentLaunchMode=["intoExisting" | "always" | 13 "none" | "never"] 14 android:enabled=["true" | "false"] 15 android:excludeFromRecents=["true" | "false"] 16 android:exported=["true" | "false"] 17 android:finishOnTaskLaunch=["true" | "false"] 18 android:hardwareAccelerated=["true" | "false"] 19 android:icon="drawable resource" 20 android:label="string resource" 21 android:launchMode=["standard" | "singleTop" | 22 "singleTask" | "singleInstance"] 23 android:maxRecents="integer" 24 android:multiprocess=["true" | "false"] 25 android:name="string" 26 android:noHistory=["true" | "false"] 27 android:parentActivityName="string" 28 android:permission="string" 29 android:process="string" 30 android:relinquishTaskIdentity=["true" | "false"] 31 android:resizeableActivity=["true" | "false"] 32 android:screenOrientation=["unspecified" | "behind" | 33 "landscape" | "portrait" | 34 "reverseLandscape" | "reversePortrait" | 35 "sensorLandscape" | "sensorPortrait" | 36 "userLandscape" | "userPortrait" | 37 "sensor" | "fullSensor" | "nosensor" | 38 "user" | "fullUser" | "locked"] 39 android:stateNotNeeded=["true" | "false"] 40 android:supportsPictureInPicture=["true" | "false"] 41 android:taskAffinity="string" 42 android:theme="resource or theme" 43 android:uiOptions=["none" | "splitActionBarWhenNarrow"] 44 android:windowSoftInputMode=["stateUnspecified", 45 "stateUnchanged", "stateHidden", 46 "stateAlwaysHidden", "stateVisible", 47 "stateAlwaysVisible", "adjustUnspecified", 48 "adjustResize", "adjustPan"] > 49 </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”模式
三、android:alwaysRetainTaskState
系統是否始終保持 Activity 所在任務的狀態 ,“true”表示保持,“false”表示允許系統在特定情況下將任務重置到其初始狀態。 默認值為“false”。該屬性只對任務的根 Activity 有意義,對于所有其他 Activity,均忽略該屬性?
正常情況下,當用戶從主屏幕重新選擇某個任務時,系統會在特定情況下清除該任務(從根 Activity 之上的堆棧中移除所有 Activity)。 系統通常會在用戶一段時間(如 30 分鐘)內未訪問任務時執行此操作?
不過,如果該屬性的值是“true”,則無論用戶如何到達任務,將始終返回到最后狀態的任務。 例如,在網絡瀏覽器這類存在大量用戶不愿失去的狀態(如多個打開的標簽)的應用中,該屬性會很有用
四、android:autoRemoveFromRecents
由具有該屬性的 Activity 啟動的任務是否一直保留在概覽屏幕中,直至任務中的最后一個 Activity 完成為止。 若為 true,則自動從概覽屏幕中移除任務。 它會替換調用方使用的?FLAG_ACTIVITY_RETAIN_IN_RECENTS
五、android:banner
一種為其關聯項提供擴展圖形化橫幅的可繪制資源。 將其與?< activity >?標記聯用可為特定 Activity 提供默認橫幅,也可與?< application >?標記聯用,為所有應用 Activity 提供橫幅?
系統使用橫幅在 Android TV 主屏幕中表示應用。 由于橫幅只顯示在主屏幕中,因此只應由包含的 Activity 能夠處理?CATEGORY_LEANBACK_LAUNCHER Intent?的應用指定?
必須將該屬性設置為對包含圖像的可繪制資源的引用(例如 “@drawable/banner”),該屬性沒有默認值
六、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()?方法。應避免使用該屬性,并且只應在萬不得已的情況下使用
屬性值 | 說明 |
---|---|
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 |
大多數 Activity 的正常啟動 | singleTop | 有條件 | 如果目標任務的頂部已存在一個 Activity 實例,則系統會通過調用該實例的 onNewIntent() 方法向其傳送 Intent,而不是創建新的 Activity 實例 |
專用啟動(不建議用作常規用途) | singleTask | 否 | 系統在新任務的根位置創建 Activity 并向其傳送 Intent。 不過,如果已存在一個 Activity 實例,則系統會通過調用該實例的 onNewIntent() 方法向其傳送 Intent,而不是創建新的 Activity 實例 |
專用啟動(不建議用作常規用途) | singleInstance | 否 | 與“singleTask””相同,只是系統不會將任何其他 Activity 啟動到包含實例的任務中。 該 Activity 始終是其任務唯一僅有的成員 |
如上表所示,standard 是默認模式,并且適用于大多數的 Activity 類型。對許多類型的 Activity 而言,SingleTop 也是一個常見并且有用的啟動模式。 其他模式 — singleTask 和 singleInstance 不適合大多數應用因為它們所形成的交互模式可能讓用戶感到陌生,并且與大多數其他應用迥異。
無論選擇哪一種啟動模式,請務必在啟動期間以及使用返回按鈕從其他 Activity 和任務返回該 Activity 時對其進行易用性測試。
十七、android:maxRecents
概覽屏幕中位于此 Activity 根位置的任務數上限。 達到該條目數時,系統會從概覽屏幕中移除最近最少使用的實例。 該值必須是整數,有效值為 1-50(低內存設備使用 25),默認值為 16
十八、android:multiprocess
是否可以將 Activity 實例啟動到啟動該實例的組件進程內 ,“true”表示可以,“false”表示不可以。默認值為“false”?
正常情況下,新的 Activity 實例會啟動到定義它的應用進程內,因此所有 Activity 實例都在同一進程內運行。 不過,如果該標志設置為“true”,Activity 實例便可在多個進程內運行,這樣系統就能在任何使用實例的地方創建實例(前提是權限允許這樣做),但這幾乎毫無必要性或可取之處
十九、android:name
實現 Activity 的類的名稱,是 Activity 的子類。 該屬性值應為完全限定類名稱(例如,“com.example.project.ExtracurricularActivity”)。不過,為了簡便起見,如果名稱的第一個字符是句點(例如,“.ExtracurricularActivity”),則名稱將追加到?< manifest >?元素中指定的軟件包名稱。開發者必須指定該名稱
二十、android:noHistory
當用戶離開 Activity 并且其在屏幕上不再可見時,是否應從 Activity 堆棧中將其移除并調用其 finish() 方法。默認值為“false”,“true”值表示 Activity 不會留下歷史軌跡。 它不會留在任務的 Activity 堆棧內,因此用戶將無法返回 Activity。 在此情況下,如果啟動另一個 Activity 來獲取該 Activity 的結果,系統永遠不會調用?onActivityResult()。該屬性是在 API 級別 3 引入的
二十一、android:parentActivityName
Activity 邏輯父項的類名稱。此處的名稱必須與為相應?< activity >?元素的?android:name?屬性指定的類名稱一致?
系統會讀取該屬性,以確定當用戶按下操作欄中的“向上”按鈕時應該啟動哪一個 Activity。 系統還可以利用這些信息通過?TaskStackBuilder?合成 Activity 的返回棧?
該屬性是在 API 級別 16 引入的,要支持 API 級別 4 - 16,還可以使用為 “android.support.PARENT_ACTIVITY” 指定值的?< meta-data >?元素來聲明父 Activity。例如:
1 <activity 2 android:name="com.example.app.ChildActivity" 3 android:label="@string/title_child_activity" 4 android:parentActivityName="com.example.app.MainActivity" > 5 <!-- Parent activity meta-data to support API level 4+ --> 6 <meta-data 7 android:name="android.support.PARENT_ACTIVITY" 8 android:value="com.example.app.MainActivity" /> 9 </activity>
二十二、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 來更改概覽屏幕中的標簽、顏色和圖標
二十五、android:resizeableActivity
指定應用是否支持多窗口顯示。您可以在?< activity >?或?< application >?元素中設置該屬性?
如果將該屬性設置為 true,則用戶可以分屏和自由形狀模式啟動 Activity。 如果將該屬性設置為 false,Activity 將不支持多窗口模式。 如果該值為 false,且用戶嘗試在多窗口模式下啟動 Activity,該 Activity 將全屏顯示?
該屬性是在 API 級別 24 添加的,如果應用面向 API 級別 24 或更高級別,但未對該屬性指定值,則該屬性的值默認設為 true
二十六、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 可以使用該設置來確保其由于某種原因崩潰時不會被移除
二十八、android: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 的上下文設置為使用該主題,它還可以引發 Activity 啟動前的“啟動”動畫以更加符合 Activity 的實際外觀?
如果未設置該屬性,則 Activity 繼承通過?< application >?元素的 theme 屬性為應用整體設置的主題。 如果該屬性也未設置,則使用默認系統主題
三十一、android:uiOptions
針對 Activity UI 的附加選項,該屬性是在 API 級別 14 添加的,必須是下列值之一
屬性值 | 說明 |
---|---|
none | 無附加 UI 選項。這是默認值 |
splitActionBarWhenNarrow | 當水平空間受限時(例如在手持設備上的縱向模式下時)在屏幕底部添加一個欄以顯示應用欄(也稱為操作欄)中的操作項)。 應用欄不是以少量操作項形式出現在屏幕頂部的應用欄中,而是分成了頂部導航區和底部操作項欄。 這可以確保操作項以及頂部的導航和標題元素都能獲得合理的空間。 菜單項不會拆分到兩個欄中,它們始終一起出現 |
三十二、android:windowSoftInputMode
Activity 的主窗口與包含屏幕軟鍵盤的窗口的交互方式。 該屬性是在 API 級別 3 引入的?
該屬性的設置影響兩個方面:?
- 當 Activity 成為用戶注意的焦點時軟鍵盤的狀態 — 隱藏還是可見。?
- 對 Activity 主窗口所做的調整 — 是否將其尺寸調小以為軟鍵盤騰出空間,或者當窗口部分被軟鍵盤遮擋時是否平移其內容以使當前焦點可見
該設置必須是下表所列的值之一,或者是一個“state…”值加上一個“adjust…”值的組合。 在任一組中設置多個值(例如,多個“state…”值)都會產生未定義結果。各值之間使用垂直條“ | ”分隔
<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
- 1
屬性值 | 說明 |
---|---|
stateUnspecified | 不指定軟鍵盤的狀態(隱藏還是可見)。 將由系統選擇合適的狀態,或依賴主題中的設置。這是對軟鍵盤行為的默認設置 |
stateUnchanged | 當 Activity 轉至前臺時保留軟鍵盤最后所處的任何狀態,無論是可見還是隱藏 |
stateHidden | 當用戶選擇 Activity 時 — 也就是說,當用戶確實是向前導航到 Activity,而不是因離開另一 Activity 而返回時 — 隱藏軟鍵盤 |
stateAlwaysHidden | 當 Activity 的主窗口有輸入焦點時始終隱藏軟鍵盤 |
stateVisible | 在正常的適宜情況下(當用戶向前導航到 Activity 的主窗口時)顯示軟鍵盤 |
stateAlwaysVisible | 當用戶選擇 Activity 時 — 也就是說,當用戶確實是向前導航到 Activity,而不是因離開另一 Activity 而返回時 — 顯示軟鍵盤 |
adjustUnspecified | 不指定 Activity 的主窗口是否調整尺寸以為軟鍵盤騰出空間,或者窗口內容是否進行平移以在屏幕上顯露當前焦點。 系統會根據窗口的內容是否存在任何可滾動其內容的布局視圖來自動選擇其中一種模式。 如果存在這樣的視圖,窗口將進行尺寸調整,前提是可通過滾動在較小區域內看到窗口的所有內容。這是對主窗口行為的默認設置 |
adjustResize | 始終調整 Activity 主窗口的尺寸來為屏幕上的軟鍵盤騰出空間 |
adjustPan | 不調整 Activity 主窗口的尺寸來為軟鍵盤騰出空間, 而是自動平移窗口的內容,使當前焦點永遠不被鍵盤遮蓋,讓用戶始終都能看到其輸入的內容。 這通常不如尺寸調正可取,因為用戶可能需要關閉軟鍵盤以到達被遮蓋的窗口部分或與這些部分進行交互 |