【Android】任務和返回棧(tasks and back stack)
tasks and back stack
一個Task 就是一組activity的集合。這些activity按照它們開啟的順序被放置於一個先進後出的棧中(back stack)。
使用者點選圖示開啟一個app時,該app的task會被移到前臺顯示。如果當前沒有該app的task,系統將會新建一個task並在其中執行Main activity。
一個activity(A)開啟另一個activity(B),B將會被置於棧頂並顯示,A仍然處於棧中,系統會儲存它的狀態。如果按下返回鍵,當前的activity將被彈出棧並destroy掉,前一個activity被resume並重新顯示(還原stop前的UI顯示)。
下圖表示2個activity切換過程該棧的狀態。
使用者可以通過返回鍵令task返回棧中的activity依次彈出,當最後一個activity也被彈出後,該task便不再存在。
如果HOME鍵被按下,從當前app回到桌面,該app的Task會被移到後臺,後臺的task所屬的所有activity都是stop狀態,且back stack依然存在——這個task其實只是失去了和使用者互動的焦點。
多個task可以同時存在後臺,但是系統也會停止一些activity來釋放空間,導致activity的狀態丟失。
Back stack中的activity不會被重新排位,如果同一個activity能被其他多個activity 啟動,這個activity都會建立新例項推入棧中:
總結Activity和task的預設行為:
-
Activity A 啟動了 Activity B , A 會被 stop ,但狀態仍然儲存( UI ,如活動條的位置, EditText 輸入的文字),從 B 返回, A 被 resumed 並恢復之前的狀態。
-
點選 HOME 返回桌面,當前的 task 被移到後臺,系統會儲存 task 中每一個 activity 的狀態;直到使用者點選 app 圖示 返回,該 task 被移回前臺, resume 棧頂的 activity 。
-
返回鍵會導致當前的 activity 從棧頂彈出並被 destroy ,該 activity 狀態不會再被儲存,前一個 activity 移到棧頂。
-
Activity 能被例項化多次,包括其它 task 啟動它。
管理Task
Android管理task和back stack的預設行為:activity 在同一個任務中建立並置於先進後出的棧中。如果這種預設的行為不能滿足我們的app設計,如:為一個activity建立一個新任務(而不是在相同的任務中),或者啟動activity時直接開啟已存在的例項(而不是直接在棧頂建立新例項),又或者在使用者離開這個task的時候清空除了棧頂以外的全部activity。Android提供了一些屬性和flag讓coder來指定管理的方式。
Intent 也有相關的flag:
android建議一般的app都不要干涉系統按照預設的方式管理activity和task。如果coder必須指定非預設的管理的方式,最好確定這種效果能符合使用者的預期。
定義Launch Mode
對<activity> 的launchMode可以指定以下值:
Use Cases |
Launch Mode |
Multiple Instances? |
Comments |
Normal launches for most activities |
"standard" |
Yes |
預設行為。每次啟動一個activity,系統都會在目標task新建一個例項。 |
Normal launches for most activities |
"singleTop" |
Conditionally |
如果目標activity的例項已經存在於目標task的棧頂,系統會直接使用該例項,並呼叫該activity的onNewIntent()(不會重新create) |
Specialized launches (not recommended for general use) |
"singleTask" |
No |
在一個新任務的棧頂建立activity的例項。如果例項已經存在,系統會直接使用該例項,並呼叫該activity的onNewIntent()(不會重新create) |
Specialized launches (not recommended for general use) |
"singleInstance" |
No |
和"singleTask"類似,但在目標activity的task中不會再執行其他的activity,在那個task中永遠只有一個activity。 |
Affinity
affinity用於指定activity所屬的task。預設狀態下,一個app中的所有activity都有相同的affinity,所以它們會執行在同一個task。而通過<activity>的taskAffinity屬性可以指定affinity。
taskAffinity要用<manifest>中定義的唯一包名來取值,系統通過包名定位到app的預設task。
taskAffinity在以下2種情況中發生作用:
-
使用FLAG_ACTIVITY_NEW_TASK啟動一個activity。如果該activity指定了taskAffinity,系統會將activity例項置於指定的task中。 注意的是,此情況下如果使用者點選HOME鍵,必須要確定有辦法能回到那個task中!(例如task所屬的app在launcher有自己icon)
-
activity 設定了 allowTaskReparenting = “true”。 當activity所在的task被移到前臺時,該activity會被移動到affinity指定的task中。
清理back stack
如果使用者離開一個task很長時間,系統會清理棧頂以下的activity,這樣task被從新開啟時,棧頂activity就被還原了。coder同樣可以通過<activity>屬性改變這種行為:
alwaysRetatinTaskState: 如果當前棧頂的activity設定此屬性為true,task中的所有activity都會被保留狀態。
clearTaskOnLaunch:如果當前棧頂的activity設定此屬性為true,行為則與alwaysRetatinTaskState相反,每次離開並重新該task,棧頂下的所有activity都會被清除,使用者返回task時永遠都是activity初始化的狀態。
finishOnTaskLaunch: 與clearTaskOnLaunch 相似,不過只作用於單個activity,不影響整個task。即使是棧頂的activity,也會生效。
轉自:http://my.oschina.net/wilsonchan/blog/92407
相關文章
- Android任務和返回棧簡單總結Android
- Android程式(Processes)和任務(tasks)的區別Android
- 四大元件之 Activity_任務和返回棧元件
- Tasks of a Database Administrator : Back Up the Database (11)Database
- Android Fragment的生命週期和返回棧AndroidFragment
- Tasks of a Database Administrator : Back Up the Fully Functional Database (14)DatabaseFunction
- 堆(heap)和棧(stack)的區別
- Java之Stack --- 棧Java
- dotnet core系列之Background tasks with hosted services (後臺任務)
- 棧Stack——遞迴替身?遞迴
- 【資料結構】棧(Stack)和佇列(Queue)資料結構佇列
- Android可見APP的不可見任務棧(TaskRecord)銷燬分析AndroidAPP
- 完全理解android Activity啟動模式LauchMode (深入Activity與任務棧)Android模式
- 巨集任務和微任務
- feed back 和 mail/call me backAI
- [CareerCup] 3.6 Sort Stack 棧排序排序
- The Stack and the Heap棧與堆__RustRust
- C++ STL stack容器——棧C++
- JavaScript巨集任務和微任務JavaScript
- React Native物理back返回鍵的使用React Native
- iOS--執行通用周邊角色任務(Performing Common Peripheral Role Tasks)iOSORM
- Event Loop、 巨集任務和微任務OOP
- 棧(Stack) --- C# 自定義和微軟官方的區別C#微軟
- js資料結構--棧(stack)JS資料結構
- Android非同步任務Android非同步
- 程序和任務
- js中的巨集任務和微任務JS
- Web Navigation(stack棧的運用)WebNavigation
- Android WorkManager 定時任務Android
- Gradle for Android系列之三 tasksGradleAndroid
- SpringCloud分散式微服務b2b2c電子商務-定時任務(Scheduling Tasks)SpringGCCloud分散式微服務
- 微任務和巨集任務哪個先執行
- 探究如何在Zoho Projects中建立和管理任務和子任務Project
- 看動畫學演算法之:棧stack動畫演算法
- Dragon_Knight_CTF-stack(棧遷移)Go
- Android中非同步任務(AsyncTask)Android非同步
- [譯]深入理解JavaScript函式執行—呼叫棧,事件迴圈和任務等JavaScript函式事件
- Stack and Queue in JavaScript(Javascript中的資料結構之棧和佇列)JavaScript資料結構佇列