完全理解android Activity啟動模式LauchMode (深入Activity與任務棧)

許佳佳233發表於2016-06-05

之前筆者已經講過了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都會在單獨的任務棧中開啟”的原則。

相關文章