FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_F
2019獨角獸企業重金招聘Python工程師標準>>>
1. 如果已經啟動了四個Activity:A,B,C和D。在D Activity里,我們要跳到B Activity,同時希望C finish掉,可以在startActivity(intent)里的intent里添加flags標記,如下所示:
Java代碼??
Intent?intent?=?new?Intent(this,?B.class);???
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);??
startActivity(intent);??
?
? 這樣啟動B?Activity,就會把D,C都finished掉,如果你的B Activity的啟動模式是默認的(multiple)?,則B Activity會finished掉,再啟動一個新的Activity B。
? 如果不想重新再創建一個新的B Activity,則在上面的代碼里再加上:
Java代碼??
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);???
?
?這樣B Activity就不會再創建一個新的了,而是會重用之前的B Activity,同時調用B Activity的onNewIntent()方法。
?
2. 如果已經啟動了四個Activity:A,B,C和D,在D Activity里,想再啟動一個Actvity B,但不變成A,B,C,D,B,而是希望是A,C,D,B,則可以像下面寫代碼:
Java代碼??
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
轉載于:https://my.oschina.net/u/2367628/blog/502032
總結
以上是生活随笔為你收集整理的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_F的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Typescript学习笔记(五) 模块
- 下一篇: VC++ 限制窗口的大小范围的方法