Activity啟動標記與啟動模式

Activity啟動標記與啟動模式

Task是包含一系列Activity的堆棧, 遵循先進后出原則

Task默認行為

(1) 前提: Activity A和Activity B在同一個應用中.
操作: Activity A啟動開僻Task堆棧(堆棧狀態: A), 在Activity A中啟動Activity B(堆棧狀態: AB), 按下BACK返回鍵(堆棧狀態: A).

(2) 前提: Activity A和Activity B在同一個應用中, 應用名稱為"TaskOne應用".
操作: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A), 在Activity A中啟動Activity B(TaskA堆棧狀態: AB), 長按Home鍵, 返回Launcher, 啟動其它應用(如:電子書),開僻一個新Task堆棧, 命名: TaskB, 長按Home健, 返回Launcher, 單擊"TaskOne應用"圖標, 此時TaskA堆棧返回前臺,Activity B為棧頂應用, 供用戶使用.

(3) 前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C在名稱為"TaskTwo應用"的應用中.
操作: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),在Activity A中啟動Activity C(TaskA堆棧狀態: AC),長按Home鍵, 返回Launcher, 啟動"TaskTwo應用"即Activity C,開僻新的Task堆棧, 命名為TaskB, 按BACK鍵返回Launcher, 單擊"TaskOne應用"圖標, 此時TaskA堆棧返回前臺,Activity C為棧頂應用, 供用戶使用.

Intent FLAG介紹

FLAG_ACTIVITY_NEW_TASK

設置此狀態,記住以下原則,首先會查找是否存在和被啟動的Activity具有相同的親和性的任務棧(即taskAffinity,注意同一個應用程序中的activity的親和性一樣,所以下面的a情況會在同一個棧中,前面這句話有點拗口,請多讀幾遍),如果有,剛直接把這個棧整體移動到前臺,并保持棧中的狀態不變,即棧中的activity順序不變,如果沒有,則新建一個棧來存放被啟動的activity

a. 前提: Activity A和Activity B在同一個應用中.
操作: Activity A啟動開僻Task堆棧(堆棧狀態: A), 在Activity A中啟動Activity B, 啟動Activity B的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK, Activity B被壓入Activity A所在堆棧(堆棧狀態: AB).
原因: 默認情況下同一個應用中的所有Activity擁有相同的關系(taskAffinity).

b. 前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C和Activity D在名稱為"TaskTwo應用"的應用中.
操作1: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),在Activity A中啟動Activity C, 啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆棧狀態: C), 長按Home鍵, 選擇TaskA,Activity A回到前臺, 再次啟動Activity C(兩種情況1.從桌面啟動;2.從Activity A啟動,兩種情況一樣), 這時TaskB回到前臺, Activity C顯示, 供用戶使用, 即:包含FLAG_ACTIVITY_NEW_TASK的Intent啟動Activity的Task正在運行, 則不會為該Activity創建新的Task,而是將原有的Task返回到前臺顯示.
操作2: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),在Activity A中啟動Activity C,啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆棧狀態: C), 在Activity C中啟動Activity D(TaskB的狀態: CD) 長按Home鍵, 選擇TaskA, Activity A回到前臺, 再次啟動Activity C(從桌面或者ActivityA啟動,也是一樣的),這時TaskB回到前臺, Activity D顯示,供用戶使用.說明了在此種情況下設置FLAG_ACTIVITY_NEW_TASK后,會先查找是不是有Activity C存在的棧,根據親和性(taskAffinity),如果有,剛直接把這個棧整體移動到前臺,并保持棧中的狀態不變,即棧中的順序不變

FLAG_ACTIVITY_CLEAR_TOP

前提: Activity A, Activity B, Activity C和Activity D在同一個應用中.
操作: Activity A啟動開僻Task堆棧(堆棧狀態: A), 在Activity A中啟動Activity B(堆棧狀態: AB), 在Activity B中啟動Activity C(堆棧狀態: ABC), 在Activity C中啟動Activity D(堆棧狀態: ABCD), 在Activity D中啟動Activity B,啟動Activity B的Intent的Flag設置為FLAG_ACTIVITY_CLEAR_TOP, (堆棧狀態: AB).

FLAG_ACTIVITY_BROUGHT_TO_FRONT

前提: Activity A在名稱為"TaskOne應用"的應用中, Activity C和Activity D在名稱為"TaskTwo應用"的應用中.
操作: 在Launcher中單擊"TaskOne應用"圖標, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),在Activity A中啟動Activity C,啟動Activity C的Intent的Flag設為FLAG_ACTIVITY_NEW_TASK,Android系統會為Activity C開僻一個新的Task, 命名為TaskB(TaskB堆棧狀態: C), 在Activity C中啟動Activity D(TaskB的堆棧狀態: CD), 長按Home鍵, 選擇TaskA, Activity A回到前臺, 在Activity A中再次啟動Activity C,在啟動Activity C的Intent中設置Flag為FLAG_ACTIVITY_BROUGHT_TO_FRONT, TaskB回到前臺,Activity C顯示, (TaskB的堆棧狀態: C).

FLAG_ACTIVITY_MULTIPLE_TASK

與FLAG_ACTIVITY_NEW_TASK結合使用, 首先在Intent中設置FLAG_ACTIVITY_NEW_TASK, 打開Activity,則啟動一個新Task, 接著在Intent中設置FLAG_ACTIVITY_MULTIPLE_TASK, 再次打開同一個Activity,則還會新啟動一個Task.

FLAG_ACTIVITY_SINGLE_TOP

當前Task堆棧中存在ABCD四個Activity, A是棧頂Activity, D為棧底Activity, 存在打開A的Intent中設置了FLAG_ACTIVITY_SINGLE_TOP標志, 則會使用棧頂A, 而不會從新New A.

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

一般與FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET結合使用,如果設置該屬性,這個activity將在一個新的task中啟動或者或者被帶到一個已經存在的task的頂部,這時這個activity將會作為這個task的首個頁面加載。將會導致與這個應用具有相同親和力的task處于一個合適的狀態(移動activity到這個task或者從中移出),或者簡單的重置這個task到它的初始狀態

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

在當前的Task堆棧中設置一個還原點,當帶有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent請求啟動這個堆棧時(典型的例子是用戶從桌面再次啟動這個應用),還原點之上包括這個應用將會被清除。應用場景:在email程序中預覽圖片時,會啟動圖片觀覽的actvity,當用戶離開email處理其他事情,然后下次再次從home進入email時,我們呈現給用戶的應該是上次email的會話,而不是圖片觀覽,這樣才不會給用戶造成困惑。

例: 存在Activity A, Activity B, Activity C, Activity A啟動開僻Task堆棧, 命名為TaskA(TaskA堆棧狀態: A),在Activity A中啟動Activity B(TaskA堆棧狀態: AB), 接著Activity B啟動Activity C(TaskA堆棧狀態: ABC),啟動Activity C的Intent中設置FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET標題, 這樣TaskA中有一個還原點,當有包含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent請求TaskA堆棧時(比如請求Activity A)系統就會將還原點以上的Activity清除, TaskA堆棧中只剩下了AB.

啟動模式launchMode介紹

standard

如果啟動此Activity的Intent中沒有設置FLAG_ACTIVITY_NEW_TASK標志, 則這個Activity與啟動他的Activity在同一個Task中,如果設置了Activity請參考上面FLAG_ACTIVITY_NEW_TASK的詳細說明,"launchMode"設置為"standard"的Activity可以被實例化多次, 可以在Task中的任何位置, 對于一個新的Intent請求就會實例化一次.

singleTop

如果啟動此Activity的Intent中沒有設置FLAG_ACTIVITY_NEW_TASK標志, 則這個Activity與啟動他的Activity在同一個Task中,如果設置了Activity請參考上面FLAG_ACTIVITY_NEW_TASK的詳細說明,"launchMode"設置為"singleTop"的Activity可以被實例化多次, 可以在Task中的任何位置, 對于一個新的Intent請求如果在Task棧頂, 則會用棧頂的Activity響影Intent請求,而不會重新實例化對象接收請求, 如果沒有在棧頂, 則會實例化一個新的對象接收Intent請求.

singleTask

"launchMode"設置為"singleTask"的Activity總是在棧底, 只能被實例化一次, 它允許其它Activity壓入"singleTask"的Activity所在的Task棧,如果有新的Intent請求有此標志的Activity, 則系統會清除有此標志的Task棧中的全部Activity,并把此Activity顯示出來.

singleInstance

launchMode"設置為"singleInstance"的Activity總是在棧底, 只能被實例化一次, 不允許其它的Activity壓入"singleInstance"的Activity所在Task棧, 即整個Task棧中只能有這么一個Activity.

taskAffinity屬性

taskAffinity屬性應和FLAG_ACTIVITY_NEW_TASK標志及allowTaskReparenting屬性結合使用, 如果只使用taskAffinity屬性

請參考上面Task默認的行為.

與FLAG_ACTIVITY_NEW_TASK標志結合

a. 前題: Activity A和Activity B在同一個應用中, Activity A與Activity B設置不同的taskAffinity屬性.
操作: Activity A啟動開僻Task堆棧,命名為TaskA(TaskA堆棧狀態: A), 在Activity A中啟動Activity B, 啟動Activity B的Intent中設置FLAG_ACTIVITY_NEW_TASK標志,這時系統會新開僻一個Task堆棧,TaskB(TaskB堆棧狀態: B).
b. 前題: Activity A在"TaskOne應用"中, Activity C在"TaskTwo應用"中, Activity A和ActivityC設置了相同的taskAffinity屬性.
操作: Activity A啟動開僻Task堆棧,命名為TaskA(TaskA堆棧狀態: A), 在Activity A中啟動Activity C, 啟動Activity C的Intent中設置FLAG_ACTIVITY_NEW_TASK標志,這時Activity C會壓入與Activity A堆棧相同的TaskA堆棧(TaskA堆棧狀態: AC).

與allowTaskReparenting屬性

例: 在"TaskOne應用"中有一個天氣預報Activity A, Activity A與"TaskOne應用"中的其它Activity有默認的關系(taskAffinity屬性都沒有設置), 并且allowTaskReparenting屬性設置為true, 現在存在一個"TaskTwo應用"啟動了"TaskOne應用"中的天氣預報Activity A, 這時Activity A與"TaskTwo應用"中的Activity在同一個Task,命名這個Task堆棧為TaskA, 這時"TaskOne應用"啟動, 并且又打開發天氣預報Activity A, 這時Activity A會從TaskA堆棧中轉移到"TaskOne應用"所在的堆棧, 即Activity A可以在多個堆棧中來回轉移.

alwaysRetainTaskState屬性

如果Task堆棧中的Root Activity設置了此屬性值為true, 不管出現任何情況, 一直會保留Task棧中Activity的狀態.

clearTaskOnLaunch屬性

如果Task堆棧中的Root Activity設置了此屬性值為true, 只要你一離開這個Task棧, 則系統會馬上清理除了Root Activity的全部Activity.

finishOnTaskLaunch屬性

如果某Activity設置了finishOnTaskLaunch屬性, 只要你一離開這個Task棧, 則系統會馬上清除這個Activity,
不管這個Activity在堆棧的任何位置.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容