APP開發(fā)實(shí)戰(zhàn)60-Activity啟動(dòng)FLAG

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狡相,一起剝皮案震驚了整個(gè)濱河市梯轻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谣光,老刑警劉巖檩淋,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萄金,居然都是意外死亡蟀悦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門氧敢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來日戈,“玉大人,你說我怎么就攤上這事孙乖≌懔叮” “怎么了份氧?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弯屈。 經(jīng)常有香客問我蜗帜,道長,這世上最難降的妖魔是什么资厉? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任厅缺,我火速辦了婚禮,結(jié)果婚禮上宴偿,老公的妹妹穿的比我還像新娘湘捎。我一直安慰自己,他們只是感情好窄刘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布窥妇。 她就那樣靜靜地躺著,像睡著了一般娩践。 火紅的嫁衣襯著肌膚如雪活翩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天欺矫,我揣著相機(jī)與錄音,去河邊找鬼穆趴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遇汞,可吹牛的內(nèi)容都是我干的未妹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼空入,長吁一口氣:“原來是場噩夢啊……” “哼络它!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歪赢,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤化戳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后埋凯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體点楼,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年白对,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掠廓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甩恼,死狀恐怖蟀瞧,靈堂內(nèi)的尸體忽然破棺而出沉颂,到底是詐尸還是另有隱情,我是刑警寧澤悦污,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布铸屉,位于F島的核電站,受9級特大地震影響切端,放射性物質(zhì)發(fā)生泄漏抬探。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一帆赢、第九天 我趴在偏房一處隱蔽的房頂上張望小压。 院中可真熱鬧,春花似錦椰于、人聲如沸怠益。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜻牢。三九已至,卻和暖如春偏陪,著一層夾襖步出監(jiān)牢的瞬間抢呆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工笛谦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抱虐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓饥脑,卻偏偏與公主長得像恳邀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子灶轰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容