intent.setFlags方法中的參數值含義

1.FLAG_ACTIVITY_CLEAR_TOP例如如今的棧狀況爲:A B C D 。D此時經過intent跳轉到B,若是這個intent添加FLAG_ACTIVITY_CLEAR_TOP標記,則棧狀況變爲:A B。若是沒有添加這個標記,則棧狀況將會變成:A B C D B。也就是說,若是添加了FLAG_ACTIVITY_CLEAR_TOP標記,而且目標Activity在棧中已經存在,則將會把位於該目標activity之上的activity從棧中彈出銷燬。這跟上面把B的Launch mode設置成singleTask相似。簡而言之,跳轉到的activity若已在棧中存在,則將其上的activity都銷掉。android

2.FLAG_ACTIVITY_NEW_TASK:例如如今棧1的狀況是:A B C。C經過intent跳轉到D,而且這個intent添加了FLAG_ACTIVITY_NEW_TASK標記,若是D這個Activity在Manifest.xml中的聲明中添加了Task affinity,系統首先會查找有沒有和D的Task affinity相同的task棧存在,若是有存在,將D壓入那個棧,若是不存在則會新建一個D的affinity的棧將其壓入。若是D的Task affinity默認沒有設置,則會把其壓入棧1,變成:A B C D,這樣就和不加FLAG_ACTIVITY_NEW_TASK標記效果是同樣的了。注意若是試圖從非activity的非正常途徑啓動一個activity(例見下文「intent.setFlags()方法中參數的用例」),好比從一個service中啓動一個activity,則intent好比要添加FLAG_ACTIVITY_NEW_TASK標記(編者按:activity要存在於activity的棧中,而非activity的途徑啓動activity時必然不存在一個activity的棧,因此要新起一個棧裝入啓動的activity)。簡而言之,跳轉到的activity根據狀況,可能壓在一個新建的棧中。ide

3.FLAG_ACTIVITY_NO_HISTORY:例如如今棧狀況爲:A B C。C經過intent跳轉到D,這個intent添加FLAG_ACTIVITY_NO_HISTORY標誌,則此時界面顯示D的內容,可是它並不會壓入棧中。若是按返回鍵,返回到C,棧的狀況仍是:A B C。若是此時D中又跳轉到E,棧的狀況變爲:A B C E,此時按返回鍵會回到C,由於D根本就沒有被壓入棧中。簡而言之,跳轉到的activity不壓在棧中。ui

4.FLAG_ACTIVITY_SINGLE_TOP:和Activity的Launch mode的singleTop相似。若是某個intent添加了這個標誌,而且這個intent的目標activity就是棧頂的activity,那麼將不會新建一個實例壓入棧中。簡而言之,目標activity已在棧頂則跳轉過去,不在棧頂則在棧頂新建activity。this

二.intent.setFlags()方法中參數的用例:spa

不少人使用startActivity時候,會碰到以下的異常:
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中有一個startActivity方法,Activity繼承自Context,重載了startActivity方法。若是使用Activity的startActivity方法,不會有任何限制,而若是使用Context的startActivity方法的話,就須要開啓一個新的task(編者按:參見一.2.的編者按),遇到上面那個異常的,都是由於使用了Context的startActivity方法。解決辦法是:Java代碼中加一個flag,即intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。這樣就能夠在新的task裏面啓動這個Activity了。xml

相關文章
相關標籤/搜索