完全理解android Activity啟動模式LauchMode (深入Activity與任務棧)
之前筆者已經講過了LauchMode的作用,以及儘量避開棧的概念使用GIF圖片的方式儘可能簡單地闡述了一下Activity的啟動模式,這篇文章就再次深入,好好講一下在各種啟動模式下,Activity與任務棧到底是如何作用的。
如果還是剛入門的讀者,建議還是先看一下筆者的前一篇文章。
上一篇文章地址:http://blog.csdn.net/double2hao/article/details/50929431
任務棧:(筆者此處就複製一下官方文件中的解釋)
如果對任務棧有深入瞭解興趣的,可以看一下官方譯文:
http://blog.csdn.net/double2hao/article/details/51589363
當前 Activity 啟動另一個 Activity 時,該新 Activity 會被推送到堆疊頂部,成為焦點所在。 前一個 Activity 仍保留在堆疊中,但是處於停止狀態。Activity 停止時,系統會保持其使用者介面的當前狀態。 使用者按“返回”按鈕時,當前 Activity 會從堆疊頂部彈出(Activity 被銷燬),而前一個 Activity 恢復執行(恢復其 UI 的前一狀態)。 堆疊中的 Activity 永遠不會重新排列,僅推入和彈出堆疊:由當前 Activity 啟動時推入堆疊;使用者使用“返回”按鈕退出時彈出堆疊。 因此,返回棧以“後進先出”物件結構執行。 圖 1 通過時間線顯示 Activity 之間的進度以及每個時間點的當前返回棧,直觀呈現了這種行為。
圖 1. 顯示任務中的每個新 Activity 如何向返回棧新增專案。 使用者按“返回”按鈕時,當前 Activity 隨即被銷燬,而前一個 Activity 恢復執行。如果使用者繼續按“返回”,堆疊中的相應 Activity 就會彈出,以顯示前一個 Activity,直到使用者返回主螢幕為止(或者,返回任務開始時正在執行的任意 Activity)。 當所有 Activity 均從堆疊中刪除後,任務即不復存在。
四種啟動模式:
standard:標準模式,這也是系統的預設模式。
在這種模式下,誰啟動了這個Activity,那麼這個Activity就執行在啟動它的那個Activity所在的棧中。
例子:
1、Activity A在任務棧S1中,Activity B在任務棧S2中,那麼如果是A 啟動了標準模式的C,那麼C就會在S1棧中,如果是B啟動了C就會在S2棧中。
singleTop:棧頂複用模式。
這種模式算是standard的優化版。仍然是誰啟動了這個Activity,那麼這個Activity就執行在啟動它的那個Activity所在的棧中。不同點就是多了一個判斷。
例子:
1、目前S1棧內的情況是ABCD,此時再啟動Activity D,如果啟動模式是standard,那麼棧內情況就是ABCDD。但是如果是singleTop模式,棧內情況就仍然還是ABCD。
注意:此處並不是把原來的D摧毀之後重新建立了一個D,而是直接把之前建立過的D拿過來用。
singleTask:棧內複用模式。
這種模式下,只要Activity在一個棧中存在,那麼多次啟動此Activity就不會重新建立例項,而是把之前建立過的例項拿過來用。但是如果不存在該Activity的例項,就會重新開啟一個棧,並把該Activity放入。
singleTask還預設具有clearTop的效果,會導致棧內所有在複用的Activity之上的Activity全部出棧。
例子:
1、當前S1任務棧中情況為ABC,此時啟動站內複用模式的Activity D,由於本來的棧中並不存在D,那麼此時就會新建一個任務棧S2,並且建立D的例項放入S2。
2、當前任務棧S1的情況為ADBC。
如果啟用標準模式的Activity D,那麼此時S1內的情況變為ADBCD。
而啟動站內複用模式的Activity D,根據棧內複用的原則,D不會重新建立,系統會把D重新切換到棧頂。原則上此時棧內情況應該變為ABCD,但是由於singleTask預設具有clearTop的效果,所以最終結果應該是AD。
singleInstance:單例項模式。
望文生義,即一個任務棧中只會存在一個單一的例項。當然也不僅僅如此,由於棧中只會存在一個例項,所以由這個例項開啟的的任何一個Activity都會在單獨的任務棧中開啟。
例子:
1、當前任務棧S1的情況是ABC(ABC啟動模式均為standard或者singleTop),此時啟動單例項的Activity D,就會新建一個任務棧S2並把D放入。從Activity D再次開啟ABC中任何一個,就會新建一個S3的任務棧,並且把這個Activity放入。此時就會存在三個任務棧S1、S2、S3。
2、當前任務棧S1的情況是ABC(A的啟動模式為singleTask),此時啟動單例項的Activity D,就會新建一個任務棧S2並把D放入。此時從Activity D開啟Activity A,會複用S1中的A。也就是說此時還是隻有兩個任務棧S1和S2。但是還是遵從singleinstance“由這個例項開啟的的任何一個Activity都會在單獨的任務棧中開啟”的原則。
相關文章
- 深入理解Android 之 Activity啟動流程(Android 10)Android
- Android-Activity的啟動模式Android模式
- Activity啟動模式模式
- 應用被其他app開啟時,不同啟動模式下activity任務棧的變化APP模式
- Android程式啟動與Activity顯示Android
- Activity生命週期與啟動模式模式
- 深入理解Activity啟動流程和AMS框架(一)框架
- 深入理解Activity啟動流程和AMS框架(二)框架
- 深入理解Activity啟動流程和AMS框架(三)框架
- Android學習筆記-Activity的啟動模式Android筆記模式
- 擼擼Android的羊毛(一)----Activity啟動模式Android模式
- Android Activity的基本理解Android
- Activity啟動模式(GIF 動態演示)模式
- 從Activity的啟動流程理解Binder
- [Android]關閉所有Activity,開啟某個ActivityAndroid
- Android Activity啟動流程原始碼分析Android原始碼
- Android原始碼分析:Activity啟動流程Android原始碼
- Android進階;Activity的棧與跳轉(筆記)Android筆記
- 原始碼閱讀之Activity啟動與App啟動流程 – Android 9.0原始碼APPAndroid
- 原始碼閱讀之Activity啟動與App啟動流程 - Android 9.0原始碼APPAndroid
- Activity 的 "啟動流程"(基於 Android 9.0)Android
- Android 8.0 原始碼分析 (四) Activity 啟動Android原始碼
- Android中Activity的四種啟動方式Android
- Android Activity是如何啟動的?Activity的生命週期是如何呼叫的?Android
- 【筆記】【Android】Activity的Task模式筆記Android模式
- 重溫Android四大元件(二)—Activity的啟動模式與標誌位Android元件模式
- Activity啟動流程分析
- ActivityRecord、TaskRecord、ActivityStack以及Activity啟動模式詳解模式
- 組內技術分享-Activity 的啟動模式模式
- 一篇文章搞懂 Activity 啟動模式模式
- Android技術棧(一)從Activity遷移到FragmentAndroidFragment
- Android入門教程之Activity(生命週期,啟動...)Android
- Android黑科技:如何啟動未註冊的ActivityAndroid
- Android系統原始碼分析--Activity啟動過程Android原始碼
- Android中Activity設計思想個人理解Android
- 完全看懂 Android 四大元件之 Activity(上)Android元件
- Android Activity Deeplink啟動來源獲取原始碼分析Android原始碼
- Activity的啟動模式及IntentFilter匹配規則總結模式IntentFilter
- 2-AI–Activity啟動方式AI