16.1.2FLAG介紹
在代碼里面通過Intent啟動(dòng)Activity的時(shí)候可以添加flag,如 :
intent.addFlags(Intent.FLAG_ACTIVITY_XXX);
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個(gè)標(biāo)志一般不是由程序代碼設(shè)置的露戒,如在launchMode中設(shè)置singleTask模式時(shí)系統(tǒng)幫你設(shè)定。
FLAG_ACTIVITY_CLEAR_TASK
此Activity將變成一個(gè)新Task中新的最底端的Activity华烟,所有的之前此Activity實(shí)例和包含該實(shí)例的Task都會(huì)被關(guān)閉,這個(gè)標(biāo)識(shí)僅僅和FLAG_ACTIVITY_NEW_TASK聯(lián)合起來才能使用持灰。
FLAG_ACTIVITY_NEW_TASK
與launchMode="singleTask"一樣的效果盔夜。
FLAG_ACTIVITY_CLEAR_TOP
清除包含此Activity的Task中位于該Activity實(shí)例之上的其他Activity實(shí)例。這種行為的 launchMode 屬性沒有對應(yīng)的值,只能通過代碼設(shè)置喂链。
單獨(dú)使用的情況:ABCD 啟動(dòng) B 返十,會(huì)銷毀B和B以上的實(shí)例 變成 AB ,B 重新執(zhí)行onCreate-> onStart
配合FLAG_ACTIVITY_SINGLE_TOP使用衩藤,則 B 不會(huì)銷毀只銷毀B以上實(shí)例吧慢,然后B 執(zhí)行onNewIntent ->onStart
配合FLAG_ACTIVITY_NEW_TASK則是singleTask效果涛漂。
FLAG_ACTIVITY_SINGLE_TOP
與launchMode="singleTop"一樣的效果赏表。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
設(shè)置了的話,該Activity則不出現(xiàn)在最近使用的列表中匈仗。
FLAG_ACTIVITY_FORWARD_RESULT
如果A需要onActivityResult中獲取返回結(jié)果瓢剿,startActivityForResult B,而B只是過渡頁悠轩,啟動(dòng)C之后就finish掉了间狂,需要在 C 中setResult返回給A就可以用到這個(gè)標(biāo)志。
A -> B-> XXXX(無論多少個(gè)過渡頁)設(shè)置FLAG_ACTIVITY_FORWARD_RESULT 來啟動(dòng) C 火架,之后該XXX過渡頁finish - > C 鉴象,那么C的結(jié)果返回給A。
FLAG_ACTIVITY_NO_HISTORY
如果設(shè)置何鸡,新的Activity將不再歷史stack中保留纺弊。用戶一離開它,這個(gè)Activity就關(guān)閉了骡男。
例如A啟動(dòng)B的時(shí)候淆游,給B設(shè)置了FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY,那么:
A-> B -> C 隔盛,啟動(dòng)C 就算 B沒有自行finish 犹菱,也會(huì)變?yōu)?AC。
FLAG_ACTIVITY_NO_ANIMATION
啟動(dòng)的時(shí)候不執(zhí)行動(dòng)畫吮炕。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
當(dāng)用戶點(diǎn)擊Home腊脱,從歷史中選擇該Activity,系統(tǒng)會(huì)自動(dòng)加上這個(gè)Flag龙亲。
FLAG_ACTIVITY_NO_USER_ACTION
在onPause()之前會(huì)調(diào)用onUserLeaving( )方法陕凹,如果使用了該標(biāo)識(shí),說明目標(biāo)Activity不和用戶交互俱笛,所以也就不需要回調(diào)onUserLeaving()方法捆姜。
FLAG_ACTIVITY_REORDER_TO_FRONT
如果設(shè)置這個(gè)標(biāo)記,新啟動(dòng)的Activity將會(huì)被放到它所屬task的最前面迎膜。
例如泥技,假如有一個(gè)Task包含4個(gè)Activity:A,B,C,D.如果D通過調(diào)用startActivity( )來啟動(dòng)B,如果使用了這個(gè)標(biāo)記磕仅,B將會(huì)排在這個(gè)task的最上面珊豹,也即現(xiàn)在的順序變成了A,C,D,B簸呈。
如果使用了FLAG_ACTIVITY_CLEAR_TOP,這個(gè)標(biāo)記將會(huì)被忽略店茶。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
如果設(shè)置該屬性蜕便,并且這個(gè)Activity在一個(gè)新的Task中正在被啟動(dòng)或者被帶到一個(gè)已經(jīng)存在的Task的頂部,這時(shí)這個(gè)Task會(huì)被重置(即該Task中之前的Activity會(huì)被關(guān)閉)贩幻,該Activity成為棧底第一個(gè)Activity轿腺。
FLAG_ACTIVITY_TASK_ON_HOME
把當(dāng)前新啟動(dòng)的任務(wù)置于Home任務(wù)之上,也就是按back鍵從這個(gè)任務(wù)返回的時(shí)候會(huì)回到Home丛楚,即使這個(gè)不是他們最后看見的Activity族壳。
注意這個(gè)標(biāo)記必須和FLAG_ACTIVITY_NEW_TASK加上Android:taskAffinity一起使用。
FLAG_DEBUG_LOG_RESOLUTION
用來調(diào)試趣些,當(dāng)設(shè)置這個(gè)標(biāo)志的時(shí)候仿荆,在解析這個(gè)intent的時(shí)候,將會(huì)打出打印信息(queryIntent函數(shù))坏平。
FLAG_INCLUDE_STOPPED_PACKAGES
FLAG_EXCLUDE_STOPPED_PACKAGES
從Android 3.1開始拢操,給Intent定義了兩個(gè)新的Flag,分別為FLAG_INCLUDE_STOPPED_PACKAGES
和FLAG_EXCLUDE_STOPPED_PACKAGES舶替,用來控制Intent是否要對處于停止?fàn)顟B(tài)的App起作用令境,顧名思義:
FLAG_INCLUDE_STOPPED_PACKAGES:表示包含未啟動(dòng)的App
FLAG_EXCLUDE_STOPPED_PACKAGES:表示不包含未啟動(dòng)的App
值得注意的是,Android 3.1開始坎穿,系統(tǒng)向所有Intent的廣播添加了FLAG_EXCLUDE_STOPPED_PACKAGES標(biāo)志展父。這樣做是為了防止廣播無意或不必要地開啟未啟動(dòng)App的后臺(tái)服務(wù)。如果要強(qiáng)制調(diào)起未啟動(dòng)的App玲昧,后臺(tái)服務(wù)或應(yīng)用程序可以通過向廣播Intent添加FLAG_INCLUDE_STOPPED_PACKAGES標(biāo)志來喚醒栖茉。
FLAG_FROM_BACKGROUND
Intent不光可以在Acitivity里面start,還可以從service里面啟動(dòng)孵延,這個(gè)參數(shù)就表示這個(gè)Intent是從后臺(tái)服務(wù)發(fā)起的吕漂。
FLAG_GRANT_PERSISTABLE_URI_PERMISSION
區(qū)別于FLAG_GRANT_READ_URI_PERMISSION 跟FLAG_GRANT_WRITE_URI_PERMISSION, URI權(quán)限會(huì)持久存在即使重啟尘应,直到明確的用revokeUriPermission(Uri, int) 撤銷惶凝。 這個(gè)flag只提供可能持久授權(quán)。但是接收的應(yīng)用必須調(diào)用ContentResolver的takePersistableUriPermission(Uri,int)方法實(shí)現(xiàn) 犬钢。
FLAG_GRANT_PERSISTABLE_URI_PERMISSION
Uri 權(quán)限授予任何原始授權(quán)URI前綴匹配的URI苍鲜。
FLAG_GRANT_PERSISTABLE_URI_PERMISSION
結(jié)合FLAG_GRANT_READ_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSION 使用。
Uri 權(quán)限授予任何原始授權(quán)URI前綴匹配的URI玷犹。如果沒有這個(gè)標(biāo)志則必須精確匹配Uri了混滔。
FLAG_GRANT_READ_URI_PERMISSION
FLAG_GRANT_WRITE_URI_PERMISSION
臨時(shí)訪問讀權(quán)限和寫權(quán)限 。Intent的接受者將被授予 INTENT 數(shù)據(jù) uri 或者 在ClipData 上的讀/寫權(quán)限。
FLAG_RECEIVER_FOREGROUND
當(dāng)發(fā)送廣播時(shí)坯屿,允許其接受者 在前臺(tái)運(yùn)行的擁有更高的優(yōu)先級油湖,更短的超時(shí)間隔。
FLAG_RECEIVER_NO_ABORT
如果是有序廣播领跛,不要允許接收者中斷廣播播乏德。
FLAG_RECEIVER_REGISTERED_ONLY
設(shè)置之后就不能通過xml來注冊監(jiān)聽這個(gè)廣播了,必須動(dòng)態(tài)注冊吠昭。
很多毒病程序?yàn)榱俗C保自己被止終后可以再次行運(yùn)喊括,都會(huì)在xml中冊注一些系統(tǒng)廣播,妄圖利用這些系統(tǒng)高頻廣播來實(shí)現(xiàn)自動(dòng)啟怎诫。
比如在老版本的android系統(tǒng)中瘾晃,毒病程序可以通過監(jiān)聽TIME_TICK來動(dòng)啟自己的service后臺(tái)行運(yùn)贷痪,做一些秘隱的作工幻妓,而且就算自己被kill失落了,也能很快重新動(dòng)啟劫拢。
而一旦這些系統(tǒng)廣播加了flag FLAG_RECEIVER_REGISTERED_ONLY肉津,這些毒病程序就沒轍了。
例如系統(tǒng)的TIME_TICK廣播舱沧,由AlarmManagerService發(fā)送妹沙,我們看源碼可以看到
mTimeTickSender = PendingIntent.getBroadcast(context, 0,
new Intent(Intent.ACTION_TIME_TICK).addFlags(
Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);
這樣就不能監(jiān)聽ACTION_TIME_TICK來自啟動(dòng)了。
FLAG_RECEIVER_REPLACE_PENDING
這個(gè)Flag 將會(huì)將之前的Intent 替代掉熟吏。加了這個(gè)Flag距糖,在發(fā)送一系列的這樣的Intent 之后,中間有些Intent 有可能在你還沒有來得及處理的時(shí)候牵寺,就被替代掉了悍引。
FLAG_ACTIVITY_NEW_DOCUMENT(FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
可以跟FLAG_ACTIVITY_MULTIPLE_TASK結(jié)合使用,當(dāng)只用自己的時(shí)候相當(dāng)于Manifast中android.R.attr.documentLaunchMode="intoExisting"帽氓,當(dāng)跟FLAG_ACTIVITY_MULTIPLE_TASK結(jié)合使用相當(dāng)于 Manifast中android.R.attr.documentLaunchMode="always"趣斤。
FLAG_ACTIVITY_RETAIN_IN_RECENTS
默認(rèn)情況下通過FLAG_ACTIVITY_NEW_DOCUMENT啟動(dòng)的Activity在關(guān)閉之后,Task中的記錄會(huì)相對應(yīng)的刪除黎休。如果為了能夠重新啟動(dòng)這個(gè)Activity你想保留它浓领,就可以使用者個(gè)flag,最近的記錄將會(huì)保留在接口中以便用戶去重新啟動(dòng)势腮。接受該Flag的Activity可以使用autoRemoveFromRecents去復(fù)寫這個(gè)request或者調(diào)用Activity.finishAndRemoveTask()方法联贩。
FLAG_ACTIVITY_MULTIPLE_TASK
這個(gè)標(biāo)識(shí)用來創(chuàng)建一個(gè)新的task棧,并且在里面啟動(dòng)新的activity(所有情況捎拯,不管系統(tǒng)中存在不存在該activity實(shí)例)泪幌,經(jīng)常和FLAG_ACTIVITY_NEW_DOCUMENT或者FLAG_ACTIVITY_NEW_TASK一起使用。
這上面兩種使用場景下,如果沒有帶上FLAG_ACTIVITY_MULTIPLE_TASK標(biāo)識(shí)座菠,他們都會(huì)使系統(tǒng)搜索存在的task棧狸眼,去尋找匹配intent的一個(gè)activity,如果沒有找到就會(huì)去新建一個(gè)task棧浴滴;但是當(dāng)和FLAG_ACTIVITY_MULTIPLE_TASK一起使用的時(shí)候拓萌,這兩種場景都會(huì)跳過搜索這步操作無條件的創(chuàng)建一個(gè)新的task。和FLAG_ACTIVITY_NEW_TASK一起使用需要注意升略,盡量不要使用該組合除非你完成了自己的頂部應(yīng)用啟動(dòng)器微王,他們的組合使用會(huì)禁用已經(jīng)存在的task棧回到前臺(tái)的功能品嚣。
taskAffinity和 allowTaskReparenting
taskAffinity用于指定當(dāng)前Activity所關(guān)聯(lián)的Task炕倘,allowTaskReparenting用于配置是否允許該Activity可以更換從屬Task,通常情況二者連在一起使用翰撑,用于實(shí)現(xiàn)把一個(gè)應(yīng)用程序的Activity移到另一個(gè)應(yīng)用程序的Task中罩旋。
allowTaskReparenting用來標(biāo)記Activity能否從啟動(dòng)的Task移動(dòng)到taskAffinity指定的Task,默認(rèn)是繼承至application中的allowTaskReparenting=false眶诈,如果為true涨醋,則表示可以更換;false表示不可以逝撬。
例如在A應(yīng)用中啟動(dòng)了B應(yīng)用的Activity浴骂,如果設(shè)置allowTaskReparenting=true,則Activity允許從A的Task移動(dòng)到B的Task宪潮。但如果A被啟動(dòng)之后溯警,Activity就會(huì)回到A的Task中。
原文鏈接:http://www.reibang.com/p/7f1c9fac2af2