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

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

1.FLAG_ACTIVITY_NEW_TASK:

例如現(xiàn)在棧一的情況是:A B C(C位于棧頂),C通過intent跳轉(zhuǎn)到D,并且這個(gè)Intent添加了FLAG_ACTIVITY_NEW_TASK標(biāo)記,如果D這個(gè)Activity在Manifest.xml中聲明了添加Task affinity,系統(tǒng)首先會(huì)查找有沒有和D的Task affinity相同的task棧存在,如果存在,就將D壓入那個(gè)棧,如果不存在則會(huì)新建一個(gè)D的affinity的棧將其壓入。如果D的Task affinity默認(rèn)沒有設(shè)置,則會(huì)將其壓入棧1,變成A B C D,這樣就和不加FLAG_ACTIVITY_NEW_TASK標(biāo)記效果是一樣的了。但如果試圖從非Activity的非正常途徑啟動(dòng)一個(gè)activity,比如從一個(gè)service、BroadcastReceiver等中啟動(dòng)一個(gè)Activity,則intent要設(shè)置Intent.FLAG_ACTIVITY_NEW_TASK標(biāo)記。Activity要存在于Activity棧中,而非Activity的途徑啟動(dòng)Activity時(shí)必然不存在一個(gè)Activity的棧,所以要新建一個(gè)Activity棧來(lái)存放要啟動(dòng)的Activity。

2.FLAG_ACTIVITY_CLEAR_TOP:

例如現(xiàn)在的棧情況為A B C D, D此時(shí)通過intent跳轉(zhuǎn)到B,如果這個(gè)intent設(shè)置FLAG_ACTIVITY_CLEAR_TOP標(biāo)記,則棧情況變?yōu)?A B。如果沒有添加這個(gè)標(biāo)記,則棧的情況將會(huì)變?yōu)椋篈 B C D B 。也就是說,如果設(shè)置了FLAG_ACTIVITY_CLEAR_TOP標(biāo)記,并且目標(biāo)Activity在棧中已存在,則會(huì)把位于該目標(biāo)Activity之上的Activity從棧中彈出銷毀。

3.FLAG_ACTIVITY_NO_HISTORY:

例如現(xiàn)在棧的情況為:A B C 。C通過intent跳轉(zhuǎn)到D,這個(gè)intent添加FLAG_ACTIVITY_NO_HISTORY標(biāo)志,此時(shí)界面顯示D的內(nèi)容,但是它并不會(huì)壓入棧中。如果按返回鍵,返回到C,棧的情況是:A B C。如果D中又跳轉(zhuǎn)到E,棧的情況為:A B C E,此時(shí)按返回鍵會(huì)回到C,因?yàn)镈根本就沒有被壓入棧中。

4.FLAG_ACTIVITY_SINGLE_TOP:

和Activity的Launch mode的singleTop類似。如果某個(gè)intent設(shè)置了這個(gè)標(biāo)志,并且這個(gè)intent的目標(biāo)Activity就是棧頂?shù)腁ctivity,那么將不會(huì)新建一個(gè)實(shí)例壓入棧中。簡(jiǎn)言之,目標(biāo)Activity已在棧頂則跳轉(zhuǎn)過去,不在棧頂則在棧頂新建Activity。

因此,使用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è)Activity棧,遇到上面的異常,是因?yàn)槭褂昧薈ontext的startActivity方法。解決的辦法是:為intent設(shè)置一個(gè)flag,即intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);這樣就可以在新的Activity棧里啟動(dòng)這個(gè)Activity了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容