理解Android Activity四種啟動方式standard, singleTop, singleTask,singleInstance

參考: 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位置。


同一個頁面被多次調(diào)用

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


其他應(yīng)用跳轉(zhuǎn)

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

Lollipop版本的行為

在同一個app中,行為跟pre-Lolipop一致。


同一個app內(nèi)

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


不同app中
任務(wù)管理器中顯示多個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()方法

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)建過實例,那么新建一個實例。

singleTask模式下新建實例

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

task中覆蓋的其他activity實例都會被銷毀

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="">

效果如下圖


配置taskAffinity

4. SingleInstance

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容