Activity 是 Android 的四大組件之一,在 Android 系統(tǒng)中是通過(guò)棧的方式對(duì)多個(gè) Activity 進(jìn)行管理款违。啟動(dòng)方式?jīng)Q定了 Android 系統(tǒng)在啟動(dòng)一個(gè) Activity 時(shí),對(duì)棧該進(jìn)行什么樣的操作。
Activity 啟動(dòng)方式
standard方式
如果不在manifest文件中聲明 activity 的 launchmode,默認(rèn)就是 standard 類(lèi)型压怠。這種類(lèi)型很簡(jiǎn)單粗暴,每次新建一個(gè) activity飞苇,都會(huì)在棧頂重新創(chuàng)建一個(gè)新的 activity菌瘫,優(yōu)點(diǎn)是簡(jiǎn)單,每次都用新的布卡,缺點(diǎn)是耗資源雨让。
singleTop 方式
之所以除了 standard 類(lèi)型都帶有 single 的前綴,google 應(yīng)該是想說(shuō)明其他幾種方式都有單例模式的影子忿等,singleTop如其名栖忠,在將要運(yùn)行一個(gè) activity 時(shí),先看看棧頂?shù)腶ctivity是不是要運(yùn)行的那個(gè)贸街,如果是就不建新的了庵寞,直接用,如果不是薛匪,就建一個(gè)新的放到棧頂捐川。暫時(shí)沒(méi)想到應(yīng)用場(chǎng)景,activity 自己調(diào)自己的時(shí)候多么逸尖,不然一樣要新建 activity古沥。
singleTask 方式
這個(gè)狠,運(yùn)行一個(gè) activity 之前娇跟,先看棧里面有沒(méi)有這個(gè) activity岩齿,沒(méi)有的話,新建一個(gè)放到棧頂苞俘,有盹沈,直接拉到棧頂用,而且秒殺原來(lái)在它上面的所有 activity吃谣,有點(diǎn)像拉大車(chē)乞封,優(yōu)點(diǎn)是省資源,而且如果一個(gè) app 需要在從 home 頁(yè)進(jìn)去n層深的頁(yè)面一下子會(huì)到 home 頁(yè)基协,按返回鍵直接退出客戶(hù)端歌亲,你就用它吧菇用。
singleInstance 方式
這種類(lèi)型的 activity 在運(yùn)行后會(huì)被安排到單間澜驮,除了第一次創(chuàng)建的時(shí)候調(diào)用 oncreate,后面不會(huì)再調(diào)惋鸥,但是會(huì)調(diào)用 onNewIntent 杂穷。網(wǎng)上的技術(shù)文章都說(shuō)像是瀏覽器悍缠,確實(shí)有點(diǎn)像,就這么理解吧耐量。
但是發(fā)現(xiàn)聲明成 singleInstance 類(lèi)型的 activity 中調(diào)用 startActivityForResult方法有問(wèn)題飞蚓,會(huì)瞬間返回一個(gè) resultcode = 0 的錯(cuò)誤結(jié)果,從 log 看廊蜒,應(yīng)該是在啟動(dòng)另一個(gè) activity 之前就返回了趴拧,可見(jiàn)startActivityForResult在此類(lèi)享受單間待遇的 activity 中已經(jīng)變成不確定因素了,所以最好別用山叮。根本原因未知著榴,還在調(diào)查中。
Intent 的常用 Flag 參數(shù)
FLAG_ACTIVITY_CLEAR_TOP
例如現(xiàn)在的棧情況為:A B C D 屁倔。D此時(shí)通過(guò) intent 跳轉(zhuǎn)到B脑又,如果這個(gè) intent 添加 FLAG_ACTIVITY_CLEAR_TOP 標(biāo)記,則棧情況變?yōu)椋篈 B锐借。如果沒(méi)有添加這個(gè)標(biāo)記问麸,則棧情況將會(huì)變成:A B C D B。也就是說(shuō)钞翔,如果添加了 FLAG_ACTIVITY_CLEAR_TOP 標(biāo)記严卖,并且目標(biāo)Activity 在棧中已經(jīng)存在,則將會(huì)把位于該目標(biāo) activity 之上的 activity 從棧中彈出銷(xiāo)毀嗅战。這跟上面把B的 Launch mode 設(shè)置成 singleTask 類(lèi)似妄田。
FLAG_ACTIVITY_NEW_TASK
例如現(xiàn)在棧1的情況是:A B C。C通過(guò) intent 跳轉(zhuǎn)到D驮捍,并且這個(gè) intent 添加了 FLAG_ACTIVITY_NEW_TASK 標(biāo)記疟呐,如果D這個(gè) Activity 在 Manifest.xml 中的聲明中添加了 Task affinity ,并且和棧1的affinity不同东且,系統(tǒng)首先會(huì)查找有沒(méi)有和D的 Task affinity 相同的 task 棧存在启具,如果有存在,將D壓入那個(gè)棧珊泳,如果不存在則會(huì)新建一個(gè)D的affinity的棧將其壓入鲁冯。如果D的 Task affinity 默認(rèn)沒(méi)有設(shè)置,或者和棧1的 affinity 相同色查,則會(huì)把其壓入棧1薯演,變成:A B C D,這樣就和不加 FLAG_ACTIVITY_NEW_TASK 標(biāo)記效果是一樣的了秧了。 注意如果試圖從非activity的非正常途徑啟動(dòng)一個(gè) activity 跨扮,比如從一個(gè)service中啟動(dòng)一個(gè) activity ,則 intent 比如要添加 FLAG_ACTIVITY_NEW_TASK 標(biāo)記。
FLAG_ACTIVITY_NO_HISTORY
例如現(xiàn)在棧情況為:A B C衡创。C通過(guò) intent 跳轉(zhuǎn)到D帝嗡,這個(gè) intent 添加FLAG_ACTIVITY_NO_HISTORY 標(biāo)志,則此時(shí)界面顯示D的內(nèi)容璃氢,但是它并不會(huì)壓入棧中哟玷。如果按返回鍵,返回到C一也,棧的情況還是:A B C巢寡。如果此時(shí)D中又跳轉(zhuǎn)到E,棧的情況變?yōu)椋篈 B C E椰苟,此時(shí)按返回鍵會(huì)回到C讼渊,因?yàn)镈根本就沒(méi)有被壓入棧中。
FLAG_ACTIVITY_SINGLE_TOP
和上面 Activity 的 Launch mode 的 singleTop 類(lèi)似尊剔。如果某個(gè) intent 添加了這個(gè)標(biāo)志爪幻,并且這個(gè) intent 的目標(biāo) activity 就是棧頂?shù)?activity ,那么將不會(huì)新建一個(gè)實(shí)例壓入棧中须误。
摘自 http://blog.sina.com.cn/s/blog_643d78190101amc7.html
摘自 http://www.cnblogs.com/playing/archive/2011/05/14/2046445.html