上一次我們了解了Activity的生命周期崎脉,也就是說我們?cè)趫?zhí)行不同的操作栈戳,Activity會(huì)有對(duì)應(yīng)的方法執(zhí)行順序。但是這個(gè)方法執(zhí)行順序是跟Activity的啟動(dòng)模式有關(guān)的,在Activity不同的啟動(dòng)模式下叁温,就算相同操作,Activity的方法執(zhí)行順序也會(huì)不一樣∮現(xiàn)在我們來看一下Activity的四種啟動(dòng)模式:
Android的啟動(dòng)模式(android:launchMode券盅,我們?cè)贏ndroidMainfest中,給Activity添加這個(gè)屬性膛檀,就可以設(shè)置啟動(dòng)模式):
1.standard(默認(rèn)啟動(dòng)模式):在默認(rèn)啟動(dòng)模式下锰镀,無論我們之前創(chuàng)建過這個(gè)Activity,還是沒有創(chuàng)建過咖刃,他都會(huì)從新創(chuàng)建一個(gè)泳炉。
2.singleInstance(全局單一模式):每一個(gè)Activity都存放到一個(gè)新的任務(wù)棧(Task)中,所以他們都是位于棧頂嚎杨。
3.singleTop(棧頂復(fù)用模式)
4.singleTask(棧內(nèi)復(fù)用模式)
試驗(yàn)一下花鹅,我們新建一個(gè)項(xiàng)目,再創(chuàng)建一個(gè)新的活動(dòng)枫浙,然后在活動(dòng)1里面啟動(dòng)活動(dòng)2刨肃,活動(dòng)2里面啟動(dòng)活動(dòng)1,看看他的執(zhí)行順序箩帚。
我們最一開始app啟動(dòng)時(shí)候啟動(dòng)活動(dòng)1紧帕,一開始的三行代碼盔然,就是啟動(dòng)活動(dòng)1,1進(jìn)入到了onResume方法,然后點(diǎn)擊了以后他進(jìn)入了onPause方法愈案,隨后依次進(jìn)入2的onCreate挺尾、onStart、onResume方法站绪。最后進(jìn)入1的onStop方法遭铺。
在2中我們又啟動(dòng)了1,我們發(fā)現(xiàn)他并沒有用之前的1恢准,而是重新創(chuàng)建了一個(gè)活動(dòng)1.我們現(xiàn)在把他們依次關(guān)閉掂僵。
我們點(diǎn)擊了一次back鍵后,我們先對(duì)新創(chuàng)建的1進(jìn)入了onPause方法顷歌,然后2的onRestart方法、onStart幔睬、onResume方法眯漩,最后把新創(chuàng)建的1onStop,最后onDestroy麻顶。
我們?cè)冱c(diǎn)back赦抖,
跟上面的步驟一樣。
而如果我們把1設(shè)為singleInstance(全局唯一模式)辅肾,然后執(zhí)行相同的操作队萤,我們來看一下還會(huì)是上面的順序嗎。
我們先把活動(dòng)的啟動(dòng)模式改為singleInstance(注意上面說的話)矫钓。然后我們跑程序要尔。
我們發(fā)現(xiàn)當(dāng)我們進(jìn)入到2后,點(diǎn)擊啟動(dòng)1時(shí)候新娜,本來應(yīng)該執(zhí)行的onCreate變成了onRestart方法赵辕。這說明在singleInstance模式下,他不會(huì)創(chuàng)建第二個(gè)相同的Activity概龄,只會(huì)創(chuàng)建一次还惠。
現(xiàn)在我們把MainActivity模式設(shè)置為singleTask,再來看一下私杜。
我們發(fā)現(xiàn)在2跳轉(zhuǎn)1的時(shí)候蚕键,我們2最后被destroy掉了。這是因?yàn)樵趕ingleTop模式下衰粹,如果在棧內(nèi)存在被調(diào)用的活動(dòng)(這里是1,1一開始就啟動(dòng)了)锣光,會(huì)把該活動(dòng)置于棧頂,并且把他棧之前位置上面的所有活動(dòng)全部destroy掉寄猩。
當(dāng)然大家自己也可以試一試singleTop模式嫉晶,這個(gè)就比較好理解了。這里就不說了。