FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_F
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1. 如果已經(jīng)啟動(dòng)了四個(gè)Activity:A,B,C和D。在D Activity里,我們要跳到B Activity,同時(shí)希望C finish掉,可以在startActivity(intent)里的intent里添加flags標(biāo)記,如下所示:
Java代碼??
Intent?intent?=?new?Intent(this,?B.class);???
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);??
startActivity(intent);??
?
? 這樣啟動(dòng)B?Activity,就會(huì)把D,C都finished掉,如果你的B Activity的啟動(dòng)模式是默認(rèn)的(multiple)?,則B Activity會(huì)finished掉,再啟動(dòng)一個(gè)新的Activity B。
? 如果不想重新再創(chuàng)建一個(gè)新的B Activity,則在上面的代碼里再加上:
Java代碼??
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);???
?
?這樣B Activity就不會(huì)再創(chuàng)建一個(gè)新的了,而是會(huì)重用之前的B Activity,同時(shí)調(diào)用B Activity的onNewIntent()方法。
?
2. 如果已經(jīng)啟動(dòng)了四個(gè)Activity:A,B,C和D,在D Activity里,想再啟動(dòng)一個(gè)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還包含其他幾個(gè)Flag標(biāo)示。
?
?Intent.FLAG_ACTIVITY_NEW_TASK
默認(rèn)的跳轉(zhuǎn)類型,會(huì)重新創(chuàng)建一個(gè)新的Activity,不過與這種情況,比方說棧中有A,B,C三個(gè)Activity,此時(shí)在C中啟動(dòng)D的話,如果在Manifest.xml文件中給D添加了Affinity的值和Task中的不一樣的話,則會(huì)在新標(biāo)記的Affinity所存在的Task中壓入這個(gè)Activity。如果是默認(rèn)的或者指定的Affinity和Task一樣的話,就和標(biāo)準(zhǔn)模式一樣了啟動(dòng)一個(gè)新的Activity.
FLAG_ACTIVITY_NO_HISTORY
意思就是說用這個(gè)FLAG啟動(dòng)的Activity,一旦推出,他就不會(huì)存在于棧中,原來是A,B,C 這個(gè)時(shí)候再C中以這個(gè)FLAG啟動(dòng)D的?,?D再啟動(dòng)E,這個(gè)時(shí)候棧中情況為A,B,C,E。
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個(gè)意思是重新創(chuàng)建一個(gè)新的Activity(即便堆棧中已經(jīng)存在這個(gè)Activity),并提到棧頂。
比如,A,B,C,D都是標(biāo)準(zhǔn)加載,然后我在D中啟動(dòng)A,這個(gè)intent加上FLAG_ACTIVITY_BROUGHT_TO_FRONT?,不要會(huì)誤認(rèn)為變成B,C,D,A!!其實(shí)不是,這個(gè)時(shí)候應(yīng)該是A,B,C,D,A.不信的人大家試試看。不過下面這個(gè)標(biāo)記和這個(gè)標(biāo)記就會(huì)讓大家明白了!
FLAG_ACTIVITY_REORDER_TO_FRONT區(qū)別
這個(gè)的意思是如果棧里已經(jīng)存在,則將它拿到棧頂,不會(huì)啟動(dòng)新Activity。比如棧中有A,B,C三個(gè)Activity。此時(shí)在C中啟動(dòng)A的話,這時(shí)候棧的順序?yàn)锽,C,A。
?
參考:
Intent對(duì)象在Android開發(fā)中起著舉足輕重的作用,其內(nèi)置了豐富的常量,用于傳遞數(shù)據(jù),下面本文將介紹跟Task有關(guān)的一些Flag參數(shù),各參數(shù)的理解均來自Android API和本人在實(shí)際項(xiàng)目中的體驗(yàn),如果有描述不當(dāng)之處,還請(qǐng)各位不吝賜教。
?
FLAG_ACTIVITY_BROUGHT_TO_FRONT: 這個(gè)標(biāo)志一般不是由程序代碼設(shè)置的,如在launchMode中設(shè)置singleTask模式時(shí)系統(tǒng)幫你設(shè)定。
?
FLAG_ACTIVITY_CLEAR_TOP: 如果目標(biāo)Activity已經(jīng)運(yùn)行于當(dāng)前的Task中,則關(guān)閉Activity Stack中在此Activity上方的所有Activity,然后將此Intent傳遞到該Activity實(shí)例內(nèi)。例如,假設(shè)一個(gè)Task的Activity Stack中包含這些Activity:A,B,C,D。如果D調(diào)用了startActivity(),并且Intent指向B,那么,C和D都將結(jié)束,然后B接收到這個(gè)Intent,因此,目前stack的狀況是:A,B。
?
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: 如果設(shè)置,這將在Task的Activity Stack中設(shè)置一個(gè)還原點(diǎn),當(dāng)Task恢復(fù)時(shí),需要清理Activity。例如下一次Task帶著FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記進(jìn)入前臺(tái)時(shí),這個(gè)Activity和它之上的都將關(guān)閉,以至于用戶不能再返回到它們,但是可以回到之前的Activity。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 如果設(shè)置,新的Activity不會(huì)在最近啟動(dòng)的Activity的列表中保存。
?
FLAG_ACTIVITY_FORWARD_RESULT: 如果設(shè)置,并且這個(gè)Intent用于從一個(gè)存在的Activity啟動(dòng)一個(gè)新的Activity,那么,這個(gè)作為答復(fù)目標(biāo)的Activity將會(huì)傳到這個(gè)新的Activity中。這種方式下,新的Activity可以調(diào)用setResult(int),并且這個(gè)結(jié)果值將發(fā)送給那個(gè)作為答復(fù)目標(biāo)的Activity。
?
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY: 這個(gè)標(biāo)志一般不由應(yīng)用程序代碼設(shè)置,如果這個(gè)Activity是從歷史記錄里啟動(dòng)的(常按HOME鍵),那么,系統(tǒng)會(huì)幫你設(shè)定。
?
FLAG_ACTIVITY_MULTIPLE_TASK: 不建議使用此標(biāo)志,除非你自己實(shí)現(xiàn)了應(yīng)用程序啟動(dòng)器。
?
FLAG_ACTIVITY_NEW_TASK: 將使Activity成為一個(gè)新Task的開始。
?
FLAG_ACTIVITY_NO_ANIMATION:??這個(gè)標(biāo)志將阻止系統(tǒng)進(jìn)入下一個(gè)Activity時(shí)應(yīng)用Acitivity遷移動(dòng)畫。
?
FLAG_ACTIVITY_NO_HISTORY: 新的Activity將不再歷史stack中保留。一旦離開,此Activity就關(guān)閉了。
?
FLAG_ACTIVITY_NO_USER_ACTION:?這個(gè)標(biāo)志將在Activity暫停之前阻止從最前方的Activity回調(diào)的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: 這個(gè)標(biāo)志將引發(fā)已經(jīng)運(yùn)行的Activity移動(dòng)到歷史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的頂端,則不再創(chuàng)建一個(gè)新的實(shí)例。
?
上面紛雜的Intent內(nèi)置參數(shù)在簡單的Android應(yīng)用時(shí),可以啟到比較好的控制作用,但是一旦Android應(yīng)用過于復(fù)雜,那么自定一個(gè)Activity List以管理Activity不失于一種更好更高效的管理方法。
具體見:http://blog.sina.com.cn/s/blog_5da93c8f0101h78f.html
轉(zhuǎn)載于:https://my.oschina.net/u/2367628/blog/502032
總結(jié)
以上是生活随笔為你收集整理的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_F的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Typescript学习笔记(五) 模块
- 下一篇: 轻松搞定RabbitMQ(二)——工作队