前言
一直知道Activity有幾種啟動模式屉凯,但一直模糊不清萎战,不是從頭去查找相關(guān)資料媳否,還真不知道每一種之間到底是什么區(qū)別特恬。
概念
棧是一種常用的數(shù)據(jù)結(jié)構(gòu)员辩,棧只允許訪問棧頂?shù)脑貙τ跅>椭荒苊看卧L問它的棧頂元素,從而可以達(dá)到保護(hù)棧頂元素以下的其他元素.”先進(jìn)后出”或”后進(jìn)先出”就是棧的一大特點(diǎn)鸵鸥,先進(jìn)棧的元素總是要等到后進(jìn)棧的元素出棧以后才能出棧.遞歸就是利用到了系統(tǒng)棧,暫時(shí)保存臨時(shí)結(jié)果,對臨時(shí)結(jié)果進(jìn)行保護(hù).
- standard 標(biāo)準(zhǔn)模式妒穴,每次都新建一個(gè)實(shí)例對象
- singleTop 如果在任務(wù)棧頂發(fā)現(xiàn)了相同的實(shí)例則重用宋税,否則新建并壓入棧頂
- singleTask 如果在任務(wù)棧中發(fā)現(xiàn)了相同的實(shí)例,將其上面的任務(wù)終止并移除讼油,重用該實(shí)例杰赛。否則新建實(shí)例并入棧
- singleInstance 允許不同應(yīng)用,進(jìn)程線程等共用一個(gè)實(shí)例矮台,無論從何應(yīng)用調(diào)用該實(shí)例都重用
分析
- standard
Activity的默認(rèn)加載方法乏屯,該方法會通過跳轉(zhuǎn)到一個(gè)新的activity,同時(shí)將該實(shí)例壓入到棧中(不管該activity是否已經(jīng)存在在Task棧中瘦赫,都是采用new操作)永遠(yuǎn)不會調(diào)用onNewIntent().
例如:棧中順序是A B C D 辰晕,此時(shí)D通過Intent跳轉(zhuǎn)到A,那么棧中結(jié)構(gòu)就變成 A B C D A 确虱,點(diǎn)擊返回按鈕的 顯示順序是 D C B A含友,依次摧毀
- singleTop
singleTop模式下,調(diào)跳轉(zhuǎn)的Activity位于棧頂,則不會重新創(chuàng)建一個(gè)新的實(shí)例并調(diào)用其onNewIntent()校辩,否則會創(chuàng)建一個(gè)新的實(shí)例壓入棧頂而不會調(diào)用onNewIntent()窘问。
例如:棧中的結(jié)構(gòu)依為A B C D,這時(shí)候跳轉(zhuǎn)到D宜咒,D不重新被創(chuàng)建惠赫,棧中結(jié)構(gòu)依然是A B C D。如果調(diào)整到B故黑,會創(chuàng)建一個(gè)B實(shí)例儿咱,這時(shí)候棧中結(jié)構(gòu)為A B C D B。
- singleTask
如果在棧中已經(jīng)有該Activity的實(shí)例倍阐,就重用該實(shí)例(會調(diào)用實(shí)例的onNewIntent())概疆。重用時(shí),會讓該實(shí)例回到棧頂峰搪,因此在它上面的實(shí)例將會被移除棧岔冀。如果棧中不存在該實(shí)例,將會創(chuàng)建新的實(shí)例放入棧中(此時(shí)不會調(diào)用onNewIntent())
例如:現(xiàn)在棧的結(jié)構(gòu)為:A B C D概耻。此時(shí)D通過Intent跳轉(zhuǎn)到B使套,則棧的結(jié)構(gòu)變成了:A B。其中的C和D被棧彈出銷毀了鞠柄,也就是說位于B之上的實(shí)例都被銷毀了
- singleInstance
singleInstance模式下侦高,會將打開的Activity壓入一個(gè)新建的任務(wù)棧中。并讓多個(gè)應(yīng)用共享該棧中的該Activity實(shí)例厌杜。一旦該模式的Activity的實(shí)例存在于某個(gè)棧中奉呛,任何應(yīng)用再激活改Activity時(shí)都會重用該棧中的實(shí)例计螺,其效果相當(dāng)于多個(gè)應(yīng)用程序共享一個(gè)應(yīng)用,不管誰激活該Activity都會進(jìn)入同一個(gè)應(yīng)用中瞧壮。這里可以理解為調(diào)用系統(tǒng)默認(rèn)瀏覽器跳轉(zhuǎn)到瀏覽器頁面登馒。
例如:Task棧1中結(jié)構(gòu)為:A B C ,C通過Intent跳轉(zhuǎn)到了D(D的模式為singleInstance)咆槽,那么則會新建一個(gè)Task棧2陈轿,棧1中結(jié)構(gòu)依舊為A B C,棧2中結(jié)構(gòu)為D秦忿,此時(shí)屏幕中顯示D麦射,之后D通過Intent跳轉(zhuǎn)到D,棧2中不會壓入新的D灯谣,所以2個(gè)棧中的情況沒發(fā)生改變潜秋。如果D跳轉(zhuǎn)到了C,那么就會根據(jù)C對應(yīng)的launchMode的在棧1中進(jìn)行對應(yīng)的操作酬屉,C如果為standard半等,那么D跳轉(zhuǎn)到C,棧1的結(jié)構(gòu)為A B C C 呐萨,此時(shí)點(diǎn)擊返回按鈕杀饵,還是在C,棧1的結(jié)構(gòu)變?yōu)锳 B C谬擦,而不會回到D切距。
Intent Flags
Flags: 表示Intent的標(biāo)志位,常用于Activity的場景中惨远,它和Activity的啟動模式有著密切的聯(lián)系
Intent.FLAG_ACTIVITY_NEW_TASK(默認(rèn))
默認(rèn)的跳轉(zhuǎn)類型,它會重新創(chuàng)建一個(gè)新的Activity,如果是默認(rèn)的或者指定的Affinity和Task一樣的話谜悟,就和標(biāo)準(zhǔn)模式一樣了啟動一個(gè)新的Activity.
FLAG_ACTIVITY_SINGLE_TOP
這個(gè)FLAG就相當(dāng)于啟動模式中的singletop
FLAG_ACTIVITY_CLEAR_TOP
這個(gè)FLAG就相當(dāng)于啟動模式中的SingleTask
FLAG_ACTIVITY_NO_HISTORY
意思就是說用這個(gè)FLAG啟動的Activity,一旦退出北秽,它不會存在于棧中葡幸,比方說!原來是A,B,C這個(gè)時(shí)候再C中以這個(gè)FLAG啟動D的贺氓,D再啟動E蔚叨,這個(gè)時(shí)候棧中情況為A,B,C,E。