1.standard:標(biāo)準(zhǔn)模式,也是默認(rèn)模式。每當(dāng)我們啟動(dòng)一個(gè)Activity,系統(tǒng)就會(huì)相應(yīng)的創(chuàng)建一個(gè)實(shí)例,不管這個(gè)實(shí)例是否已經(jīng)存在。
2.singleTop:棧頂復(fù)用模式,如果要啟動(dòng)的Activity處于棧的頂部,那么此時(shí)系統(tǒng)不會(huì)創(chuàng)建新的實(shí)例,而是直接打開(kāi)此頁(yè)面,同時(shí)它的onNewIntent()方法會(huì)被執(zhí)行,可以通過(guò)Intent進(jìn)行傳值,而且它的onCreate(),onStart()方法不會(huì)被調(diào)用,因?yàn)樗](méi)有發(fā)生任何變化。
3.singleTask:棧內(nèi)復(fù)用模式,如果棧中存在這個(gè)Activity的實(shí)例就會(huì)復(fù)用這個(gè)Activity,不管它是否位于棧頂,復(fù)用時(shí),會(huì)將它上面的Activity全部出棧,因?yàn)閟ingleTask本身自帶clearTop這種功能。并且會(huì)回調(diào)該實(shí)例的onNewIntent()方法。
4.singleInstance:?jiǎn)螌?shí)例模式,該模式具備singleTask模式的所有特性外,與它的區(qū)別就是,這種模式下的Activity會(huì)單獨(dú)占用一個(gè)Task棧,具有全局唯一性。以singleInstance模式啟動(dòng)的Activity在整個(gè)系統(tǒng)中是單例的,如果在啟動(dòng)這樣的Activiyt時(shí),已經(jīng)存在了一個(gè)實(shí)例,那么會(huì)把它所在的任務(wù)調(diào)度到前臺(tái),重用這個(gè)實(shí)例。
啟動(dòng)模式的特點(diǎn):
1.standard特點(diǎn):(1) Activity默認(rèn)的啟動(dòng)模式。(2) 新Activity在啟動(dòng)它的Activity所在的棧中。
2.singleTop特點(diǎn):若需新建的Activity位于任務(wù)棧棧頂,那么此Activity的實(shí)例就不會(huì)重建,而是重用棧頂?shù)膶?shí)例,否則就創(chuàng)建該Activity新的實(shí)例并置于棧頂。
3.singleTask特點(diǎn):(1)查看Activity想要的任務(wù)棧是否存在,若不存在則重建一個(gè)任務(wù)棧,創(chuàng)建該Activity實(shí)例并置于棧中。(2)若任務(wù)棧存在,則查看Activity是否存在棧中,若存在棧中,則將該Activity以上的所有Activity出棧,使該Activity處于棧頂。
4.singleInstance特點(diǎn):直接創(chuàng)建一個(gè)新的任務(wù)棧,并創(chuàng)建該Activity實(shí)例放于新的任務(wù)棧中
特例:
如果存在activityA,B(啟動(dòng)模式singleTask/singleInstance),C(stabdard)
調(diào)起過(guò)程為A-->B-->C-->B-->C...后面循環(huán)
A啟動(dòng)B時(shí)調(diào)用了finish,
或者A沒(méi)有調(diào)用finish,A和C設(shè)置了不同的taskAffinity,就是不在同一個(gè)棧
結(jié)果:C只創(chuàng)建一次實(shí)例
A沒(méi)有調(diào)用finish,而且和C在同一個(gè)棧
結(jié)果二:如果A沒(méi)有調(diào)用finish,則C每次啟動(dòng)都會(huì)創(chuàng)建新實(shí)例
總結(jié):ActivityA的啟動(dòng)模式為standard時(shí),如果ActivityA所在的棧只有ActivityA一個(gè)實(shí)例,那么其他棧的Activity調(diào)起ActivityA,ActivityA只會(huì)創(chuàng)建一次實(shí)例,就是只走一次onCreate,第二次調(diào)用會(huì)走onRestart,如果ActivityA所在棧存在其他Activity實(shí)例,則ActivityA每次啟動(dòng)都會(huì)創(chuàng)建新的實(shí)例