FLAG_ACTIVITY_CLEAR_TOP
一. intent.setFlags()方法中的參數(shù)值含義:
1.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從棧中彈出銷毀玻粪。這跟上面把B的Launch mode設(shè)置成singleTask類似隅津。簡(jiǎn)而言之,跳轉(zhuǎn)到的activity若已在棧中存在劲室,則將其上的activity都銷掉伦仍。
FLAG_ACTIVITY_NEW_TASK
2.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,系統(tǒng)首先會(huì)查找有沒(méi)有和D的Task affinity相同的task棧存在喉磁,如果有存在谓苟,將D壓入那個(gè)棧,如果不存在則會(huì)新建一個(gè)D的affinity的棧將其壓入协怒。如果D的Task affinity默認(rèn)沒(méi)有設(shè)置涝焙,則會(huì)把其壓入棧1,變成:A B C D孕暇,這樣就和不加FLAG_ACTIVITY_NEW_TASK標(biāo)記效果是一樣的了仑撞。注意如果試圖從非activity的非正常途徑啟動(dòng)一個(gè)activity(例見(jiàn)下文“intent.setFlags()方法中參數(shù)的用例”),比如從一個(gè)service中啟動(dòng)一個(gè)activity妖滔,則intent比如要添加FLAG_ACTIVITY_NEW_TASK標(biāo)記(編者按:activity要存在于activity的棧中隧哮,而非activity的途徑啟動(dòng)activity時(shí)必然不存在一個(gè)activity的棧,所以要新起一個(gè)棧裝入啟動(dòng)的activity)座舍。簡(jiǎn)而言之沮翔,跳轉(zhuǎn)到的activity根據(jù)情況,可能壓在一個(gè)新建的棧中簸州。
FLAG_ACTIVITY_NO_HISTORY
3.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)有被壓入棧中。簡(jiǎn)而言之灾螃,跳轉(zhuǎn)到的activity不壓在棧中题翻。
FLAG_ACTIVITY_SINGLE_TOP
4.FLAG_ACTIVITY_SINGLE_TOP:和Activity的Launch mode的singleTop類似。如果某個(gè)intent添加了這個(gè)標(biāo)志腰鬼,并且這個(gè)intent的目標(biāo)activity就是棧頂?shù)腶ctivity嵌赠,那么將不會(huì)新建一個(gè)實(shí)例壓入棧中。簡(jiǎn)而言之熄赡,目標(biāo)activity已在棧頂則跳轉(zhuǎn)過(guò)去姜挺,不在棧頂則在棧頂新建activity。
二.intent.setFlags()方法中參數(shù)的用例:
很多人使用startActivity時(shí)候彼硫,會(huì)碰到如下的異常:Caused by: Android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?都知道炊豪,Context中有一個(gè)startActivity方法,Activity繼承自Context拧篮,重載了startActivity方法词渤。如果使用Activity的startActivity方法,不會(huì)有任何限制他托,而如果使用Context的startActivity方法的話掖肋,就需要開啟一個(gè)新的task(編者按:參見(jiàn)一.2.的編者按),遇到上面那個(gè)異常的赏参,都是因?yàn)槭褂昧薈ontext的startActivity方法志笼。解決辦法是:Java代碼中加一個(gè)flag,即intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)把篓。這樣就可以在新的task里面啟動(dòng)這個(gè)Activity了纫溃。
總結(jié)
今天遇到了購(gòu)物下單,跳了好幾個(gè)activity之后需要回到首頁(yè)韧掩,如果要一個(gè)一個(gè)關(guān)閉的話會(huì)很麻煩紊浩,所以就想到了Flag的屬性設(shè)置,使用了FLAG_ACTIVITY_CLEAR_TOP疗锐,我就調(diào)查了解以下坊谁。