1. 若是已經啓動了四個Activity:A,B,C和D。在D Activity裏,咱們要跳到B Activity,同時但願C finish掉,能夠在startActivity(intent)裏的intent裏添加flags標記,以下所示:html
Intent intent = new Intent(this, B.class); 動畫
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); this
startActivity(intent); spa
這樣啓動B Activity,就會把D,C都finished掉,若是你的B Activity的啓動模式是默認的(multiple) ,則B Activity會finished掉,再啓動一個新的Activity B。orm
若是不想從新再建立一個新的B Activity,則在上面的代碼裏再加上:xml
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 對象
這樣B Activity就不會再建立一個新的了,而是會重用以前的B Activity,同時調用B Activity的onNewIntent()方法。blog
2. 若是已經啓動了四個Activity:A,B,C和D,在D Activity裏,想再啓動一個Actvity B,但不變成A,B,C,D,B,而是但願是A,C,D,B,則能夠像下面寫代碼:
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
此外Intent還包含其餘幾個Flag標示。
Intent.FLAG_ACTIVITY_NEW_TASK
默認的跳轉類型,會從新建立一個新的Activity,不過與這種狀況,比方說棧中有A,B,C三個Activity,此時在C中啓動D的話,若是在Manifest.xml文件中給D添加了Affinity的值和Task中的不同的話,則會在新標記的Affinity所存在的Task中壓入這個Activity。若是是默認的或者指定的Affinity和Task同樣的話,就和標準模式同樣了啓動一個新的Activity.
FLAG_ACTIVITY_NO_HISTORY
意思就是說用這個FLAG啓動的Activity,一旦推出,他就不會存在於棧中,原來是A,B,C 這個時候再C中以這個FLAG啓動D的 , D再啓動E,這個時候棧中狀況爲A,B,C,E。
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個意思是從新建立一個新的Activity(即使堆棧中已經存在這個Activity),並提到棧頂。
好比,A,B,C,D都是標準加載,而後我在D中啓動A,這個intent加上FLAG_ACTIVITY_BROUGHT_TO_FRONT ,不要會誤認爲變成B,C,D,A!!其實不是,這個時候應該是A,B,C,D,A.不信的人你們試試看。不過下面這個標記和這個標記就會讓你們明白了!
FLAG_ACTIVITY_REORDER_TO_FRONT區別
這個的意思是若是棧裏已經存在,則將它拿到棧頂,不會啓動新Activity。好比棧中有A,B,C三個Activity。此時在C中啓動A的話,這時候棧的順序爲B,C,A。
參考:
Intent對象在Android開發中起着舉足輕重的做用,其內置了豐富的常量,用於傳遞數據,下面本文將介紹跟Task有關的一些Flag參數,各參數的理解均來自Android API和本人在實際項目中的體驗,若是有描述不當之處,還請各位不吝賜教。
FLAG_ACTIVITY_BROUGHT_TO_FRONT: 這個標誌通常不是由程序代碼設置的,如在launchMode中設置singleTask模式時系統幫你設定。
FLAG_ACTIVITY_CLEAR_TOP: 若是目標Activity已經運行於當前的Task中,則關閉Activity Stack中在此Activity上方的全部Activity,而後將此Intent傳遞到該Activity實例內。例如,假設一個Task的Activity Stack中包含這些Activity:A,B,C,D。若是D調用了startActivity(),而且Intent指向B,那麼,C和D都將結束,而後B接收到這個Intent,所以,目前stack的情況是:A,B。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: 若是設置,這將在Task的Activity Stack中設置一個還原點,當Task恢復時,須要清理Activity。例以下一次Task帶着FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標記進入前臺時,這個Activity和它之上的都將關閉,以致於用戶不能再返回到它們,可是能夠回到以前的Activity。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 若是設置,新的Activity不會在最近啓動的Activity的列表中保存。
FLAG_ACTIVITY_FORWARD_RESULT: 若是設置,而且這個Intent用於從一個存在的Activity啓動一個新的Activity,那麼,這個做爲答覆目標的Activity將會傳到這個新的Activity中。這種方式下,新的Activity能夠調用setResult(int),而且這個結果值將發送給那個做爲答覆目標的Activity。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY: 這個標誌通常不禁應用程序代碼設置,若是這個Activity是從歷史記錄裏啓動的(常按HOME鍵),那麼,系統會幫你設定。
FLAG_ACTIVITY_MULTIPLE_TASK: 不建議使用此標誌,除非你本身實現了應用程序啓動器。
FLAG_ACTIVITY_NEW_TASK: 將使Activity成爲一個新Task的開始。
FLAG_ACTIVITY_NO_ANIMATION: 這個標誌將阻止系統進入下一個Activity時應用Acitivity遷移動畫。
FLAG_ACTIVITY_NO_HISTORY: 新的Activity將再也不歷史stack中保留。一旦離開,此Activity就關閉了。
FLAG_ACTIVITY_NO_USER_ACTION: 這個標誌將在Activity暫停以前阻止從最前方的Activity回調的onUserLeaveHint()。
FLAG_ACTIVITY_PREVIOUS_IS_TOP: If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.
FLAG_ACTIVITY_REORDER_TO_FRONT: 這個標誌將引起已經運行的Activity移動到歷史stack的頂端。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED: If set, and this activity is either being started in a new task or bringing to the top an existing task, then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it), or simply resetting that task to its initial state if needed.
FLAG_ACTIVITY_SINGLE_TOP: 若是Activity位於Activity Stack的頂端,則再也不建立一個新的實例。
上面紛雜的Intent內置參數在簡單的Android應用時,能夠啓到比較好的控制做用,可是一旦Android應用過於複雜,那麼自定一個Activity List以管理Activity不失於一種更好更高效的管理方法。
具體見:http://blog.sina.com.cn/s/blog_5da93c8f0101h78f.html