說起Android中的啟動模式,其實是個很基礎(chǔ)的內(nèi)容,誰都知道是4中啟動模式,沒錯分別是以下四種:
1,standard
2,singleTop
3,singleTask
4,singleInstance
關(guān)于高深的純理論說明這里就不多做贅述,畢竟文字說明太饒人,這里就準(zhǔn)備說點(diǎn)簡單的,能看得見的,現(xiàn)在開始吧。
第一種:standard(默認(rèn))
關(guān)于這種模式,大家都知道,就是Android默認(rèn)的啟動模式,就是不顯示指定,就是這種模式?,F(xiàn)在有FirstActivity和SecondActivity兩個界面,代碼里都打印了當(dāng)前實例和taskId,格式為xx/xx
測試情景:重復(fù)跳轉(zhuǎn)自己(自己設(shè)置standard)
794為task的Id,前面的為當(dāng)前實例對象,可見每次都是新建的,并不是復(fù)用的。@f37d177是第一個頁面,一共跳轉(zhuǎn)了三次。同樣退出應(yīng)用也用了三次。

結(jié)論:standard模式下,會不斷地新建activity實例,都放入同一個task中
第二種:singleTop
測試情景一:重復(fù)跳轉(zhuǎn)自己(自己設(shè)置singleTop)
看起來好像沒有點(diǎn)擊一樣,其實是點(diǎn)擊了的,注意看Actionbar上的點(diǎn)擊計數(shù),點(diǎn)擊了3次,三次的實例和taskId都是沒有變化的,且最后退出應(yīng)用就用了一次點(diǎn)擊,如下圖:

測試情景二:循環(huán)跳轉(zhuǎn)到目標(biāo)頁面(SecondActivity設(shè)置singleTop)
可以看到兩次跳轉(zhuǎn)到SecondActivity時,實例都不一樣,且最后返回到桌面也是和進(jìn)入的次數(shù)一樣多。這里進(jìn)入了兩次SecondActivity,且最終從SecondActivity退出應(yīng)用,一共用了4次,如下圖

結(jié)論:顧名思義,singleTop,如果當(dāng)前實例在當(dāng)前的task的棧頂,則直接復(fù)用,測試情景一;如果當(dāng)前實例不再棧頂,則新建實例,如測試情景二,因為每次都是從FirstActivity跳轉(zhuǎn)到SecondActivity的,雖然第二次跳轉(zhuǎn)到SecondActivity的時候已經(jīng)存在了SecondActivity實例,可是因為不在棧頂,所以又新建了一個SecondActivity實例。
第三種:singleTask
測試情景一:重復(fù)跳轉(zhuǎn)自己(自己設(shè)置singleTask)
跳轉(zhuǎn)了自己4次,可以看到實例和taskId都是沒有變化,且最后一次就能退出應(yīng)用,如下圖:

測試情景二:循環(huán)跳轉(zhuǎn)到目標(biāo)頁面(SecondActivity設(shè)置singleTask)
這里我們注意到一開始FirstActivity的實例為a2c5349,然后跳轉(zhuǎn)到SecondActivity實際一直都是5d5dd2a,而且taskId兩個界面也是一致的,最后在SecondActivity按了一次返回鍵,直接返回到了最初的a2c5349實例界面,也就是第一個界面,如下圖:

結(jié)論:設(shè)置了singleTask的頁面,只要是task中有這個實例,就會一直復(fù)用,而且每次復(fù)用這個已存在的實例,都會清空上面的其他實例(這里的FirstActivity),將自己直接提升到棧頂位置,顯示自己
第四種:singleInstance
測試情景一:重復(fù)跳轉(zhuǎn)自己(自己設(shè)置singleInstance)
跳轉(zhuǎn)了5次,但是可以發(fā)現(xiàn)實例和task的值都沒有變化,退出應(yīng)用也只是一次退出,如下圖:

測試情景二:循環(huán)跳轉(zhuǎn)到目標(biāo)頁面(SecondActivity設(shè)置singleInstance)
可以看到一開始從FirstActivity跳轉(zhuǎn)跳轉(zhuǎn)到SecondActivity的時候,taskId發(fā)生了變化,F(xiàn)irstActivity的id是863,但是跳轉(zhuǎn)到SecondActivity的時候變成了864,然后后面每次跳轉(zhuǎn)到SecondActivity的時候?qū)嵗蛅ask的id都是沒有變化;說說返回的場景
如果最后從FirstActivity返回,那么會把之前壓入棧的FirstActivity全部返回完之后才進(jìn)入SecondActivity頁面,然后從SecondActivity一次就能退出應(yīng)用;
如果最后從SecondActivity頁面返回,那么一次就會回到FirstActivity,然后把之前壓入棧的FirstActivity全部返回完才退出了應(yīng)用;
壓入棧的如下圖所示:

結(jié)論:設(shè)置了singleInstance的頁面,初始時都是新建一個task棧給這個頁面,然后后面一直復(fù)用這個棧內(nèi)的頁面。注意,只有這種模式會新建一個棧給初始化的頁面。最后返回的規(guī)律是,先把本頁面所在的棧都出完,然后再彈出下一個棧的每個頁面。
至此,四種模式簡單分析完畢,希望能給大家一個直觀的理解