SingleTask作為Android Activity的四個(gè)啟動(dòng)模式之一钥平,啟動(dòng)這種啟動(dòng)模式的Acivity,需要把握3個(gè)知識(shí)點(diǎn)铜秆。說(shuō)明 : 以下內(nèi)容中A是一個(gè)被標(biāo)記為SingleTask的Activity
? ? 1. A“喜歡”(Affinity)的任務(wù)棧在哪里垮媒?
? ? 2.掉起A時(shí)CleanTop了誰(shuí)原杂?
? ? 3.調(diào)起的Activity都在哪個(gè)任務(wù)棧盯拱?
詳細(xì)說(shuō)明:
知識(shí)點(diǎn)1:關(guān)于TaskAffinity的說(shuō)明祥得。
????????我們知道activity被啟動(dòng)后允青,activity會(huì)進(jìn)入任務(wù)棧橄碾。默認(rèn)activity的任務(wù)棧名為應(yīng)用包名,如果想讓activity進(jìn)入另一個(gè)名字的任務(wù)棧,則需要在manifest.xml對(duì)應(yīng)的activity組件節(jié)點(diǎn)下添加android:taskAffinity = “xxx.xxx.xxx”,另外值得說(shuō)明的是,這個(gè)屬性只有在singleTask這個(gè)啟動(dòng)模式下配套使用才有效堪嫂,換句話說(shuō)標(biāo)有standar,singleTop啟動(dòng)模式的activity即使添加了這個(gè)屬性偎箫,啟動(dòng)后仍然和啟動(dòng)它的Activity在同一個(gè)任務(wù)棧,不會(huì)獨(dú)立創(chuàng)建新的任務(wù)棧,把a(bǔ)ctivity實(shí)例放入皆串。(SingleInstance啟動(dòng)模式淹办,作為SingleTask增強(qiáng)版,我們以后再聊它恶复。)下面開(kāi)始說(shuō)說(shuō)任務(wù)棧和SingleTask的那些事兒怜森。
? ? ? ? 當(dāng)一個(gè)Activity要啟動(dòng)A(以下內(nèi)容中A是一個(gè)被標(biāo)記為SingleTask的Activity)時(shí),系統(tǒng)會(huì)先看看這個(gè)A有沒(méi)有自己喜歡谤牡,想要呆的任務(wù)棧副硅。如果沒(méi)有(Manifest.xml中沒(méi)有明確表明taskAffinity)系統(tǒng)就認(rèn)為A想要呆在默認(rèn)的任務(wù)棧中,接下來(lái)就到名字和包名一致的任務(wù)棧中找A的實(shí)例翅萤,沒(méi)找到就創(chuàng)建一個(gè)A的實(shí)例恐疲,壓入棧頂;找到A的實(shí)例套么,那么就把A上面的其它Activity 清除掉(CleanTop)培己,A調(diào)到棧頂。
? ? ? ? 系統(tǒng)如果發(fā)現(xiàn)要啟動(dòng)的A有自己喜歡的任務(wù)棧胚泌,它的名字叫com.example.study省咨,那么系統(tǒng)就就會(huì)去找這個(gè)任務(wù)棧,發(fā)現(xiàn)“誒玷室?居然還沒(méi)有創(chuàng)建”零蓉,那么系統(tǒng)就創(chuàng)建這個(gè)名字叫com.example.study的任務(wù)棧,同時(shí)創(chuàng)建A的實(shí)例穷缤,并把A放到這個(gè)任務(wù)棧里敌蜂;而另一方面,如果系統(tǒng)發(fā)現(xiàn)A喜歡的任務(wù)棧已經(jīng)存在津肛,那么就會(huì)把A從任務(wù)占中翻出來(lái)紊册,放到棧頂,當(dāng)然之前A上面壓的其他Activity就統(tǒng)統(tǒng)被cleanTop掉了快耿。
? ? ? ? Conclusion:調(diào)起SingleTask模式的Activity,第一步找任務(wù)棧芳绩;第二步找實(shí)例掀亥;第三步CleanTop和置頂。
知識(shí)點(diǎn)2:CleanTop了誰(shuí)妥色?
知識(shí)點(diǎn)3:調(diào)起的Activity究竟在哪個(gè)棧搪花?
? ? 這兩點(diǎn)合在一起說(shuō),原因是開(kāi)始看書的時(shí)候我并沒(méi)有太深入思考CleanTop中哪些activity實(shí)例能作為A的top這個(gè)知識(shí)點(diǎn)。后來(lái)在寫demo的時(shí)候有一種情況調(diào)起A后撮竿,任務(wù)棧的結(jié)果和我想的不一樣吮便,所以回頭再琢磨發(fā)現(xiàn)這2個(gè)知識(shí)點(diǎn)被我忽視了。
? ? 要寫的demo是這樣:
? ? ? ? 前提條件闡述:1.A的啟動(dòng)模式是SingleTask幢踏,其他的Activity BC都是standar啟動(dòng)模式髓需;2.A有taskAffinity屬性。3.B上有2個(gè)按鈕房蝉,點(diǎn)擊后能分別調(diào)起A和C僚匆;4.A,C界面分別有1個(gè)按鈕,點(diǎn)擊后可以調(diào)起B(yǎng).
? ? ? ? 操作流程:B點(diǎn)擊按鈕調(diào)起A搭幻,A點(diǎn)擊按鈕調(diào)起B(yǎng)咧擂,B按鈕調(diào)起C,C點(diǎn)擊按鈕調(diào)起B(yǎng)檀蹋,B點(diǎn)擊按鈕調(diào)起A松申,問(wèn)此時(shí)棧和棧里的Activity實(shí)例情況,哈哈哈俯逾。
? ? ? ? 結(jié)果:任務(wù)棧2個(gè):1個(gè)默認(rèn)任務(wù)棧TaskStack1(名稱和應(yīng)用包名一致)1個(gè)是A的taskAffinity指定的任務(wù)棧TaskStack2贸桶;Activity實(shí)例2個(gè):1個(gè)TaskStack1中的B,1個(gè)TaskStack2中的A纱昧。
? ? ? ? ?解釋:Activity刨啸,更嚴(yán)謹(jǐn)?shù)恼f(shuō)以standar,singleTop模式作為launchMode的Activity,調(diào)起它的Activity在哪個(gè)任務(wù)棧识脆,它們的實(shí)例就會(huì)被壓到哪個(gè)任務(wù)棧中设联。所以Demo操作的詳細(xì)流程:“B點(diǎn)擊按鈕調(diào)起A”B在TaskStack1,A在TaskStack2灼捂;“A點(diǎn)擊按鈕調(diào)起B(yǎng)离例,B按鈕調(diào)起C,C點(diǎn)擊按鈕調(diào)起B(yǎng)”悉稠,這一系列操作產(chǎn)生的activity實(shí)例都在TaskStack2宫蛆,此時(shí)TaskStack2的棧內(nèi)情況從下到上一次為ABCB;最后"B點(diǎn)擊按鈕調(diào)起A"的猛,系統(tǒng)先找A喜歡的任務(wù)棧TaskStack2存在嗎耀盗?存在!TaskStack2里有A實(shí)例嗎卦尊?有叛拷!接下來(lái)CleanTop,最后BCB出棧岂却,TaskStack2里僅剩A忿薇。
很有意思裙椭!
最后說(shuō)一下A的生命周期
onCreate----onStart----onResume----。署浩。揉燃。---onPause--(B的onCreate? ?onStart? ?onResume)---onStop--------------------------------------------當(dāng)最后"B點(diǎn)擊按鈕調(diào)起A"------(B的onPause)-----A的onNewIntent---onRestart---onStart----onResume---(B的onStop,onDestroy筋栋,留個(gè)疑問(wèn)炊汤,cleanTop的B onDestroy會(huì)立即執(zhí)行嘛?太晚了二汛,明天驗(yàn)證婿崭!)