明天就是端午節(jié)了,先在這里預(yù)祝大家端午節(jié)快樂(lè)误褪!
記得以前的這個(gè)時(shí)候责鳍,一般都是請(qǐng)幾天假,湊夠一周兽间,出去浪一圈再回來(lái)历葛,哈哈,今年嘀略,因?yàn)橐恍﹤€(gè)人原因吧恤溶,這次沒(méi)有去遠(yuǎn)方,想安安靜靜的沉淀下自己帜羊,整理下思路咒程,該何去何從。
接著上一章的 《Android開發(fā)藝術(shù)探索》第一章筆記(一) Activity超詳細(xì)的生命周期理解 后孵坚,下面來(lái)復(fù)習(xí)下Activity的啟動(dòng)模式。話說(shuō)窥淆,我也是經(jīng)常用到其中的兩種卖宠,嘻嘻...。
兩個(gè)要點(diǎn):
- Activitry的LaunchMode
- Activity的Flags
一 Activitry的LaunchMode
一個(gè)應(yīng)用程序通常被拆分為多個(gè)Activity,在默認(rèn)情況下忧饭,當(dāng)我們多次啟動(dòng)同一個(gè)activity時(shí)扛伍,系統(tǒng)會(huì)創(chuàng)建多個(gè)實(shí)例并把它們放入任務(wù)棧中,任務(wù)棧是一種“ 后進(jìn)先出 ”的棧結(jié)構(gòu)词裤。除了默認(rèn)的情況刺洒,還有其他的情況。目前有四種啟動(dòng)模式:
- standard(默認(rèn))
- singleTop
- singleTask
- singleInstance
(1) standard(默認(rèn)) :標(biāo)準(zhǔn)模式吼砂,一調(diào)用startActivity()方法就會(huì)產(chǎn)生一個(gè)新的實(shí)例逆航,不管這個(gè)實(shí)例是否已經(jīng)存在。
(2) singleTop :棧頂復(fù)用模式渔肩,如果某個(gè)Activity的Launch mode設(shè)置成singleTop因俐,那么當(dāng)該Activity位于棧頂?shù)臅r(shí)候,再通過(guò)Intent跳轉(zhuǎn)到本身這個(gè)Activity,則將不會(huì)創(chuàng)建一個(gè)新的實(shí)例壓入棧中抹剩。如果新Activity的實(shí)例已經(jīng)存在但不是位于棧頂撑帖,那么新Activity仍然會(huì)重新重建。
例如:現(xiàn)在棧的情況為:A B C D澳眷。D的Launch mode設(shè)置成了singleTop胡嘿,那么在D中啟動(dòng)Intent跳轉(zhuǎn)到D,那么將不會(huì)新創(chuàng)建一個(gè)D的實(shí)例壓入棧中钳踊,此時(shí)棧的情況依然為:A B C D衷敌。但是如果此時(shí)B的模式也是singleTop,D跳轉(zhuǎn)到B拓瞪,那么則會(huì)新建一個(gè)B的實(shí)例壓入棧中逢享,因?yàn)榇藭r(shí)B不是位于棧頂,此時(shí)棧的情況就變成了:A B C D B吴藻。
(3)singleTask :棧內(nèi)復(fù)用模式瞒爬。這是一種單例模式,如果某個(gè)Activity是singleTask模式沟堡,那么Task棧中將會(huì)只有一個(gè)該Activity的實(shí)例侧但。
例如:現(xiàn)在棧的情況為:A B C D。B的Launch mode為singleTask航罗,此時(shí)D通過(guò)Intent跳轉(zhuǎn)到B禀横,則棧的情況變成了:A B。而C和D被彈出銷毀了粥血,也就是說(shuō)位于B之上的實(shí)例都被銷毀了柏锄。
(4)singleInstance :單實(shí)例模式,這是一種加強(qiáng)的singleTask模式复亏,它除了具有singleTask模式的所有特性之外趾娃,還加強(qiáng)了一點(diǎn),那就是此種模式的Activity只能單獨(dú)地位于一個(gè)任務(wù)棧中缔御。
例如:Task棧1的情況為:A B C抬闷。C通過(guò)Intent跳轉(zhuǎn)到D,而D的Launch mode為singleInstance耕突,則將會(huì)新建一個(gè)Task棧2笤成。此時(shí)Task棧1的情況還是為:A B C。Task棧2的情況為:D眷茁。此時(shí)屏幕界面顯示D的內(nèi)容炕泳,
如果這時(shí)D又通過(guò)Intent跳轉(zhuǎn)到D,則Task棧2中也不會(huì)新建一個(gè)D的實(shí)例上祈,所以兩個(gè)棧的情況也不會(huì)變化培遵。而如果D跳轉(zhuǎn)到C挣磨,則棧1的情況變成了:A B C C,因?yàn)镃的Launch mode為standard荤懂,此時(shí)如果再按返回鍵,則棧1變成:A B C塘砸。也就是說(shuō)現(xiàn)在界面還顯示C的內(nèi)容节仿,不是D。
好了掉蔬,現(xiàn)在有一個(gè)問(wèn)題就是這時(shí)這種情況下如果用戶點(diǎn)擊了Home鍵廊宪,則再也回不到D的即時(shí)界面了。如果想解決這個(gè)問(wèn)題女轿,可以為D在Manifest.xml文件中的聲明加上
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
加上這段之后箭启,也就是說(shuō)該程序中有兩個(gè)這種聲明,另一個(gè)就是那個(gè)正常的根 activity蛉迹,在打成apk包安裝之后傅寡,在程序列表中能看到兩個(gè)圖標(biāo),但是如果都運(yùn)行的話北救,在任務(wù)管理器中其實(shí)也只有一個(gè)荐操。上面的情況點(diǎn)擊D的那個(gè)圖標(biāo)就能回到它的即時(shí)界面(比如一個(gè)EditText,以前輸入的內(nèi)容珍策,現(xiàn)在回到之后依然存在)托启。
二 Activity的Flags
Activity的Flags有很多,這里看一些常用的標(biāo)記位攘宙。
FLAG_ACTIVITY_NEW_TASK
其效果和在XML中指定啟動(dòng)“singleTask”模式相同
FLAG_ACTIVITY_SINGLE_TOP
如果設(shè)置屯耸,當(dāng)這個(gè)Activity位于歷史stack的頂端運(yùn)行時(shí),不再啟動(dòng)一個(gè)新的蹭劈。
FLAG_ACTIVITY_CLEAR_TOP
如果設(shè)置疗绣,并且這個(gè)Activity已經(jīng)在當(dāng)前的Task中運(yùn)行,因此铺韧,不再是重新啟動(dòng)一個(gè)這個(gè)Activity的實(shí)例持痰,而是在這個(gè)Activity上方的所有Activity都將關(guān)閉,然后這個(gè)Intent會(huì)作為一個(gè)新的Intent投遞到老的Activity(現(xiàn)在位于頂端)中祟蚀。
-------- 例如愈魏,假設(shè)一個(gè)Task中包含這些Activity:A莹规,B,C,D矿微。如果D調(diào)用了startActivity(),并且包含一個(gè)指向Activity B的Intent旷余,那么空闲,C和D都將結(jié)束,然后B接收到這個(gè)Intent,因此匀借,目前stack的狀況是:A颜阐,B。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
如果設(shè)置吓肋,新的Activity不會(huì)在最近啟動(dòng)的Activity的列表中保存凳怨。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
這個(gè)標(biāo)志一般不由應(yīng)用程序代碼設(shè)置,如果這個(gè)Activity是從歷史記錄里啟動(dòng)的(常按HOME鍵)是鬼,那么肤舞,系統(tǒng)會(huì)幫你設(shè)定。
FLAG_ACTIVITY_NO_HISTORY
使用這個(gè)模式啟動(dòng)Activity均蜜,當(dāng)該Activity啟動(dòng)其他Activity后李剖,該Activity消失了,不會(huì)保留在棧Activity中囤耳。
還有一些篙顺,可以去參考官方文檔,我們不必去死記硬背充择,理解即可~
晚安慰安,好夢(mèng)~