Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 完全理解android Activity啟動模式LauchMode (深入Activity與任務棧)

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

編輯:關於Android編程

之前筆者已經講過了LauchMode的作用,以及盡量避開棧的概念使用GIF圖片的方式盡可能簡單地闡述了一下Activity的啟動模式,這篇文章就再次深入,好好講一下在各種啟動模式下,Activity與任務棧到底是如何作用的。

任務棧:(筆者此處就復制一下官方文檔中的解釋)

當前 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,此時再啟動ActivityD,如果啟動模式是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都會在單獨的任務棧中打開”的原則。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved