Activity啓動模式

據我們所知Activity有多種啓動模式,各種啓動模式啓動所帶來的行爲是不同的,據官方文檔所說,在manifest文件<activity>元素中可以設置如下幾個屬性:

taskAffinity

launchMode

而在Intent中,有如下幾個FLAG是比較常用的:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_SINGLE_TOP

下面就來看一下這些屬性和FLAG的設置會影響到Activity的什麼行爲

Activity的啓動模式

有兩種方法可以定義Activity啓動模式,在manifest文件中定義和使用Intent的FLAG定義,這兩種定義模式各有各的不同,但是在兩者同時存在的時候以Intent中定義的啓動模式爲準。

manifest文件中定義:

當在manifest文件中定義Activity的時候,可以通過設置<activity>標籤下的launchMode屬性來設置當前Activity的啓動模式,有如下幾個可選項

1.standard(標準模式):

standard模式是系統默認的啓動模式。每次啓動一個Activity都會創建出一個新的實例,在一個任務棧中可以有多個Activity的實例。以這種模式啓動的Activity將會在啓動它的Activity所在的任務棧中,不可以用ApplicationContext去啓動standard模式的Activity,不然會出現異常,因爲ApplicationContext沒有自己的任務棧。

2.singleTop:

棧頂複用模式。如果啓動的Activity在當前任務棧的棧頂,那麼不會重新啓動,只會調用Activity的onNewIntent方法,但是如果啓動的Activity不在當前任務棧的棧頂,將會創建新的實例,所以說以這種模式啓動的Activity也會在同一個任務棧中存在多個實例。

3.singleTask:

當一個Activity以這種模式啓動時,系統會尋找這個Activity的相關任務棧,如果這個任務棧存在,就會檢查任務棧中是否有這個Activity的實例,如果有,就不會創建Activity,如果沒有則會創建出這個Activity併入棧。如果這個Activity的相關任務棧不存在,則會創建出一個任務棧,並且將Activity放到新的任務棧中。

上面提到的相關任務棧是什麼呢?以下是官方文檔的一些介紹:

如果在Intent中加入了一個FLAG_ACTIVITY_NEW_TASK flag或者在manifest文件中配置的啓動模式是singleTask的話,系統將檢查當前任務棧的affinity和該Activity設置的affinity是否相同,如果相同則會把它放到當前的任務棧中,如果不同將會創建一個新的任務棧,默認情況下Activity的affinity爲當前應用的包名。

有一點需要注意,如果創建的這個Activity的相關任務棧存在,並且在任務棧中存在這個Activity的實例的話將會把這個任務棧放到棧頂,那麼在這個Activity實例之上的Activity都將執行出棧操作。

4.singleInstance:

這種模式和singleTask很像,基本上由singleTask的所有特點。但是不同的是以這種模式創建的Activity只能自己單獨的處於一個任務棧中。

使用Intent的FLAG設置

1.FLAG_ACTIVITY_NEW_TASK:

和singleTask模式類似,啓動的Activity都會位於自己的任務棧中。以這種模式啓動Activity經常用來列出很多可以啓動的選項來進行啓動。

2.FLAG_ACTIVITY_SINGLE_TOP:

和singleInstance模式基本相同。

3.FLAG_ACTIVITY_CLEAR_TOP:

設置了這個FLAG的Activity在啓動的時候如果在當前任務棧中已經存在實例,會將存在的實例之上的所有Activity全部出棧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章