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


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

  1.FLAG_ACTIVITY_NEW_TASK:

  例如現在棧一的情況是:A    B   C(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,比如從一個service、BroadcastReceiver等中啟動一個Activity,則intent要設置Intent.FLAG_ACTIVITY_NEW_TASK標記。Activity要存在於Activity棧中,而非Activity的途徑啟動Activity時必然不存在一個Activity的棧,所以要新建一個Activity棧來存放要啟動的Activity。

  2.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從棧中彈出銷毀。

    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根本就沒有被壓入棧中。

  4.FLAG_ACTIVITY_SINGLE_TOP:

   和Activity的Launch mode的singleTop類似。如果某個intent設置了這個標志,並且這個intent的目標Activity就是棧頂的Activity,那么將不會新建一個實例壓入棧中。簡言之,目標Activity已在棧頂則跳轉過去,不在棧頂則在棧頂新建Activity。

 

因此,使用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方法,就必須新建一個Activity棧,遇到上面的異常,是因為使用了Context的startActivity方法。解決的辦法是:為intent設置一個flag,即intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);這樣就可以在新的Activity棧里啟動這個Activity了。

  以上內容轉自:http://blog.csdn.net/berber78/article/details/7278408


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM