參考: https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en
Android在內(nèi)存管理上良好的設(shè)計架構(gòu),使Acitivity成為Android上最常用的概念,它的出現(xiàn)完美的解決了移動操作系統(tǒng)上的多任務(wù)處理。
然而,Activity不僅僅是指顯示在屏幕上的界面,啟動也值得一看。下面我們就來看一下LaunchMode。
使用LaunchMode
使用很簡單,不再贅述,如下
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask">
只要在AndroidManifest.xml中申明Activity中添加launchMode即可。
一共有四中type,我們一個一個來看。
1. standard
這是默認(rèn)選擇,如果不顯示設(shè)置,則默認(rèn)為這個。
這個模式下的Activity每次都是創(chuàng)建一個新的實例用來處理每一個發(fā)來的intent。想象一下,如果有十個發(fā)給處理郵件的Activity,那么會創(chuàng)建十份實例來單獨(dú)處理每一個發(fā)來的intent。
在Lollipop之前版本的行為
在同一個Task(任務(wù)棧)上,每次創(chuàng)建的實例都放到Task的top位置。

如果從其他應(yīng)用跳轉(zhuǎn),那么該實例在其他應(yīng)用所在的task上。比如說這里從Gallery跳轉(zhuǎn)到我們的Activity,那么Activity實例剛在Gallery所在task的top位置,如下圖

但是這里有點(diǎn)奇怪,在任務(wù)管理器中可以看到,Gallery的task上顯示的不是Gallery相關(guān)的頁面;而且如果想回到Gallery的Activity頁面的話,還得從我們的這個Activity中返回才可以。

Lollipop版本的行為
在同一個app中,行為跟pre-Lolipop一致。

但在不同app跳轉(zhuǎn)時,會新建一個task。


這是因為Lolipop版本中修改了Task Management system。這種實現(xiàn)使你在發(fā)生跳轉(zhuǎn)后,可以通過切換task返回到原來的應(yīng)用,而不是非要把當(dāng)前的activity彈出task任務(wù)棧。
2. singleTop
singleTop跟standard模式基本相同。唯一的不同是如果調(diào)用者task中已經(jīng)存在了相同的activity實例并且該實例在task頂部,那么就不會再創(chuàng)建新實例,而是調(diào)用該實例的onNewIntent()方法

所以在singleTop模式下,在處理intent的時候,同時需要在onCreate和onNewIntent兩個地方考慮好。
singleTop最常見的一個應(yīng)用場景是搜索頁面searchActivity。在搜索某一項結(jié)束后,如果再發(fā)起搜索,那么應(yīng)該是原來已經(jīng)存在的searchActivity再繼續(xù)處理,而比重新創(chuàng)建一個實例來處理要好。
3. singleTask
該模式跟前面兩種顯著不同。就如同單例模式一樣,該模式只允許該Acitivity實例只有一份。如果該Activity實例已經(jīng)存在,當(dāng)intent來的時候,該Activity實例所在的task會調(diào)用到top位置,并且觸發(fā)該Activity實例的onNewIntent方法。
在同一個app內(nèi)
如果之前沒有創(chuàng)建過實例,那么新建一個實例。

但是如果已經(jīng)創(chuàng)建過實例,那么實例所在的task中該實例上面的所有其他Activity實例都會被銷毀(調(diào)用生命周期方法);同時我們的activity實例被調(diào)用onNewIntent方法。

Google文檔中描述到
The system creates a new task and instantiates the activity at the root of the new task.
但是實際上的行文跟文檔上有一些不一樣。(可以通過dumpsys activity命令查看)
SingleTask模式的Activity仍然占在一個存在task上,而不是重新創(chuàng)建一個新的task。
如果想和Google文檔中描述的一致,可以使用taskAffinity屬性。
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask"
android:taskAffinity="">
效果如下圖

4. SingleInstance
和singleTask很像。如果singleInstance的實例調(diào)用其他activity,那么該acitivity新創(chuàng)建一個task;如果該singleInstance模式的activity被創(chuàng)建,同樣的會新創(chuàng)建一個task。