Activity 啓動模式

啓動 Activity 分爲 顯示調用和隱式調用。顯示調用需要明確地指定被啓動對象的組件信息,包括包名和類名,而隱式調用則不需要明確指定組件信息。

Activity的LaunchMode

4種啓動模式:standard、singleTop、singleTask、singleInstance

1、standard 標準模式:

每次啓動一個Activity都會重新創建一個新的實例,不管這個實例是否存在。誰啓動了這個Activity,那麼這個Activity就運行在啓動它的那個Activity所在的棧中。

2、singleTop 棧頂複用模式:

如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,它的onNewIntent方法會被回調(onCreate、onStart方法不會被調用)。
如果新Activity的實例已存在但不是位於棧頂,那麼新Activity仍然會被重新創建。

3、singleTask 棧內複用模式

這是一種單實例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啓動此Activity都不會重新創建實例,和singleTop一樣,系統也會回調其onNewIntent。
具體一點,當一個具有singleTask模式的Activity請求啓動後,比如Activity A,系統首先會尋找是否存在A想要的任務棧,
如果不存在,就重新創建一個任務棧,然後創建A的實例後把A放到棧中
如果存在A所需的任務棧,這時要看A是否在棧中有實例存在,如果有實例存在,那麼系統就會把A調到棧頂(在A之上的棧內其他Activity出棧),並調用它的onNewIntent方法;如果實例不存在,就創建A的實例並把A壓入棧中。

4、singleInstance 單實例模式

這是一種加強的singleTask模式,它除了具有singleTask模式的所有特性外,還加強了一點,那就是具有此種模式的Activity只能單獨地位於一個任務棧中,換句話說,比如Activity A是singleInstance模式,當A啓動後,系統會爲它創建一個新的任務棧,然後A獨自在這個新的任務棧中,由於棧內複用的特性,後續的請求均不會創建新的Activity,除非這個獨特的任務棧被系統銷燬了。

Activity的Flags

Activity的Flags有很多,這裏主要分析一些比較常用的標記位。標記位的作用很多,有的標記位可以設定Activity的啓動模式,比如FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_SINGLE_TOP 等;還有的標記位可以影響Activity的運行狀態,比如 FLAG_ACTIVITY_CLEAR_TOP 和 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等。

FLAG_ACTIVITY_NEW_TASK

這個標記位的作用是爲 Activity 指定“singleTask”啓動模式,其效果和在 XML 中指定該啓動模式相同。

FLAG_ACTIVITY_SINGLE_TOP

這個標記位的作用是爲 Activity 指定“singleTop” 啓動模式,其效果和在 XML 中指定該啓動模式相同。

FLAG_ACTIVITY_CLEAR_TOP

具有此標記位的 Activity,當它啓動時,在同一個任務棧中所有位於它上面的 Activity 都要出棧。
這個標記位一般會和 singleTask 啓動模式一起出現,在這種情況下,被啓動 Activity的實例如果已經存在,那麼系統就會調用它的 onNewIntent( singleTask 啓動模式默認就具有此標記位的效果);
如果被啓動的Activity採用 standard 模式啓動,那麼它連同它之上的Activity都要出棧,系統會創建新的 Activity 實例並放入棧頂。

FLAG_ACTIVITY_EXCLUEDE_FROM_RECENTS

具有這個標記的Activity不會出現在歷史 Activity 的列表中,當某些情況下我們不希望用戶通過歷史列表回到我們的 Activity 的時候這個標記比較有用。它等同於在 XML 中指定 Activity 的屬性 android:excludeFromRecents="true"。



IntentFilter 的匹配規則

Activity 的隱式調用需要 Intent 能夠匹配目標組件的 IntentFilter 中所設置的過濾信息,如果不匹配將無法啓動目標 Activity。IntentFilter 中的過濾信息有 action、category、data。一個 Activity 中可能有多個 intent-filter。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章