詳解Android Activity啟動模式
相關(guān)的基本概念:
1、任務(wù)棧(Task)
若干個(gè)Activity的集合的棧表示一個(gè)Task。
棧不僅僅只包含自身程序的Activity,它也可以跨應(yīng)用包含其他應(yīng)用的Activity,這樣有利于保障用戶體驗(yàn),維護(hù)用戶操作體驗(yàn)上的完整性。
例如:微信ActivityA 分享文章到QQActivityB,兩個(gè)activity是存在于不同app中的,但是被系統(tǒng)放在一個(gè)任務(wù)中,分享后,用戶按back鍵返回,可以返回到原來的微信Activity A中,這就確保了用戶體驗(yàn)。
2、查看當(dāng)前系統(tǒng)的任務(wù)棧
命令行中 -- > adb shell dumpsys activity
3、Activity 的相關(guān)屬性
android:taskAffinity:是否定義了該屬性,對接下來討論到的singleTask影響甚大,如果設(shè)置了Activity的taskAffinity屬性值,Activity將在TaskName為指定值的獨(dú)立Task中啟動,否則,將在原來的默認(rèn)Task中。
android:allowTaskReparenting:主要作用是activity的遷移,程序A已經(jīng)啟動了若干個(gè)Activity,其中包含Activity1(這個(gè)Activity1擁有該屬性),當(dāng)程序B也要啟動它的時(shí)候,其可遷移到程序B內(nèi)。
android:alwaysRetainTaskState:操作系統(tǒng)會在程序長時(shí)間不會動的時(shí)候,清除Task狀態(tài),如果開啟這個(gè),系統(tǒng)會繼續(xù)保持直到再次打開,只對根Activity生效(ABC,A是棧底,C是棧頂,只能對A即可)。例如微信在后臺,當(dāng)我們再次打開應(yīng)用時(shí),系統(tǒng)會判斷是否已經(jīng)存在以A為根Activity的棧,如果有,直接使用該棧,并顯示棧頂?shù)腁ctivity。
android:clearTaskOnLaunch:用來標(biāo)記是否在啟動該Activity時(shí),清除除根目錄的其他Activity
android:exported:是否支持其它應(yīng)用調(diào)用當(dāng)前組件。默認(rèn)值:包含有intent-filter 默認(rèn)值為true(); 沒有intent-filter默認(rèn)值為false。
四種啟動模式:
standard:每次激活A(yù)ctivity時(shí)(startActivity),都創(chuàng)建Activity實(shí)例,并放入任務(wù)棧;
singleTop:如果該Activity位于任務(wù)棧棧頂,則不需要創(chuàng)建,復(fù)用實(shí)例并且會調(diào)用該實(shí)例的onNewIntent()方法將Intent對象傳遞到這個(gè)實(shí)例中,其余情況都要創(chuàng)建Activity實(shí)例;(singleTop模式,只在當(dāng)前任務(wù)棧中生效、startActivityForResult啟動一個(gè)設(shè)置了singleTop的activity,singleTop模式將無效)
關(guān)于onNewIntent():
根據(jù)文檔知,當(dāng)Activity的啟動模式是singleTop或者使用FLAG_ACTIVITY_SINGLE_TOP這個(gè)標(biāo)記啟動新的Activity并且Activity棧頂就是待啟動的Activity的時(shí)候,會調(diào)用原Activity的這個(gè)方法;例子:QActivity為棧頂復(fù)用模式,當(dāng)Qactivity位于棧頂時(shí),再次打開,onResume() -- >onPause() -- >onNewIntent() -- >onResume() 。當(dāng)Qactivity不位于棧頂時(shí),onNewIntent-- >onRestart-- >onStart-- >onResume(也就是說只要棧頂不是Qactivity ,都會創(chuàng)建新的實(shí)例,是Qactivity則重用不新建)。
singleTask:使用好棧內(nèi)復(fù)用模式對taskAffinity屬性的理解很重要。
存在相同taskAffinity屬性值的Task:不存在實(shí)例,則新建Activity實(shí)例。如果存在則把當(dāng)前實(shí)例中復(fù)用實(shí)例, 這個(gè) Activity 啟動并且清除頂部的 Acitivity ,通過標(biāo)識 CLEAR_TOP。
taskAffinity屬性值不一樣的Task:在這個(gè) Task 中新建這個(gè) Activity 實(shí)例。
singleInstance:和singleTask差不多,唯一不同的是singleInstance Activity實(shí)例的Task只能存放一個(gè)該模式的Activity實(shí)例,例如Qactivity加載Wactivity都會被放入其它的Task中,如果存在與Wactivity相同affinity的Task,則在該Task內(nèi)創(chuàng)建Wactivity。如果不存在,則重新生成新的Task并入棧。
常用Intent Flags:
FLAG_ACTIVITY_NEW_TASK:如果task中已經(jīng)有了你要啟動的activity的話,當(dāng)前task會被帶到前臺(不管這個(gè)activity是否在前臺,有可能activity上邊還壓有別的activity)。如果配合FLAG_ACTIVITY_NEW_MULTI_TASK,則無論什么情況都會創(chuàng)建新的Task,就成了類似 singleInstance 的情況了。如果配合 FLAG_ACTIVITY_CLEAR_TASK,則會先清空該棧,然后向棧中添加目標(biāo)Activity,棧ID不變。
例如:Flag為FLAG_ACTIVITY_NEW_TASK,Qactivity(棧為LOL)啟動Wactivity(棧為DOTA),接著啟動Eactivity(棧為DOTA),Home回桌面。打開該應(yīng)用,Qactivity啟動Wactivity,Eactvity會出現(xiàn)在前臺,因?yàn)樗钦麎K棧啟動(里面順序不變)。
FLAG_ACTIVITY_SINGLE_TOP:相當(dāng)于launchMode中的singleTop。
FLAG_ACTIVITY_CLEAR_TOP:與singleTask類似,但有極大區(qū)別,它會銷毀目標(biāo)Activity和它之上的所有Activity,重新創(chuàng)建目標(biāo)Activity,并沒有執(zhí)行onNewIntent()。
tips:指定啟動模式時(shí),F(xiàn)lags的優(yōu)先級大于launchMode,當(dāng)兩者都有時(shí),以Intent Flag有效。
注意事項(xiàng):
1、當(dāng)目標(biāo)的啟動模式不為標(biāo)準(zhǔn)模式時(shí),不要使用startActivityForResult去啟動目標(biāo),容易出現(xiàn)你意想不到的結(jié)果。
例如:(大概意思,startActivityForResult相當(dāng)于白設(shè)置,會返回一個(gè)取消的結(jié)果)
2、當(dāng)Activity執(zhí)行了onDestroy,沒有執(zhí)行finish,那么實(shí)例都還是存在棧里的。但Activity被finish掉了,則它會是新建實(shí)例重新入棧,不會按啟動模式想的那樣。
轉(zhuǎn)載自:http://www.cnblogs.com/wujiancheng/

責(zé)任編輯:售電衡衡
- 相關(guān)閱讀
- 泛在電力物聯(lián)網(wǎng)
- 電動汽車
- 儲能技術(shù)
- 智能電網(wǎng)
- 電力通信
- 電力軟件
- 高壓技術(shù)
-
權(quán)威發(fā)布 | 新能源汽車產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵(lì)“光儲充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車,產(chǎn)業(yè),設(shè)計(jì) -
中國自主研制的“人造太陽”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng)
-
新基建助推 數(shù)據(jù)中心建設(shè)將迎爆發(fā)期
2020-06-16數(shù)據(jù)中心,能源互聯(lián)網(wǎng),電力新基建 -
泛在電力物聯(lián)網(wǎng)建設(shè)下看電網(wǎng)企業(yè)數(shù)據(jù)變現(xiàn)之路
2019-11-12泛在電力物聯(lián)網(wǎng) -
泛在電力物聯(lián)網(wǎng)建設(shè)典型實(shí)踐案例
2019-10-15泛在電力物聯(lián)網(wǎng)案例
-
新基建之充電樁“火”了 想進(jìn)這個(gè)行業(yè)要“心里有底”
2020-06-16充電樁,充電基礎(chǔ)設(shè)施,電力新基建 -
燃料電池汽車駛?cè)雽こ0傩占疫€要多久?
-
備戰(zhàn)全面電動化 多部委及央企“定調(diào)”充電樁配套節(jié)奏
-
權(quán)威發(fā)布 | 新能源汽車產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵(lì)“光儲充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車,產(chǎn)業(yè),設(shè)計(jì) -
中國自主研制的“人造太陽”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
能源革命和電改政策紅利將長期助力儲能行業(yè)發(fā)展
-
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng) -
5G新基建助力智能電網(wǎng)發(fā)展
2020-06-125G,智能電網(wǎng),配電網(wǎng) -
從智能電網(wǎng)到智能城市