intent.setFlags方法中的參數(shù)值含義

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從棧中彈出銷(xiāo)毀。這跟上面把B的Launch mode設(shè)置成singleTask類(lèi)似。簡(jiǎn)而言之,跳轉(zhuǎn)到的activity若已在棧中存在,則將其上的activity都銷(xiāo)掉。

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類(lèi)似。如果某個(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方法的話(huà),就需要開(kāi)啟一個(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à)會(huì)很麻煩,所以就想到了Flag的屬性設(shè)置,使用了FLAG_ACTIVITY_CLEAR_TOP,我就調(diào)查了解以下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容