launchMode IntentFlag

測(cè)試環(huán)境:Google Nexus 4- 5.0.0- API 21

工具: 使用adb shell dumpsys activity 查看activity 屬于哪個(gè)task

新建或重用activity的生命周期

啟動(dòng)一個(gè)Activity根據(jù)launchMode 和Intent flag判斷是新建還是重用:

新建 : onCreate -> onStart -> onResume; 重用: onNewIntent ->(onStart)-> onResume.

getIntent() 得到的是原來的intent择同, 可以通過setIntent(Intent) 更新intent

tasks-and-back-stack 官方文檔

launchMode

Standard

默認(rèn)模式近忙,新建并放在調(diào)用者的task里面

SingleTop

task頂一致則重用螺垢,否則新建

SingleInstance

該activity 只允許單例存在且獨(dú)占一個(gè)task 里面

SingleTask

-如果已存在taskAffinity 一致的task,進(jìn)一步判斷是否存在改activity贼穆,存在則重用,并把這位置之上的清除,否則新建一個(gè)放在上面茁肠。
-如果不存在taskAffinity 一致的task泽腮,新建一個(gè)task

taskAffinity: task類型,用于區(qū)分task. task的taskAffinity等于第一個(gè)插入該task的activity的taskAffinity,后面插入的activity的taskAffinity可以和stack的taskAffinity不同.

示例:

1.(A -> B -> C )

<Activity android:name=".A"/>
<Activity android:name=".B" android:launchMode="singleTask"/>
<Activity android:name=".C"/> 

結(jié)果:

task1 task2
A B C

B默認(rèn)taskAffinity與A相同都是包名御蒲,所以放在相同task里面;并且還未存在 所以新建B

2.(A -> B -> C)

<Activity android:name=".A"/>
<Activity android:name=".B" android:launchMode="singleTask" android:taskAffinity=".task2"/>
<Activity android:name=".C"/>

結(jié)果:

task1 task2
A B C

B定義了一個(gè)新taskAffinity,所以放在一個(gè)新task里面,C是默認(rèn)的诊赊,跟著創(chuàng)建它的B

3.(A -> B -> C -> B)

<Activity android:name=".A"/>
<Activity android:name=".B" android:launchMode="singleTask" android:taskAffinity=".task2"/>
<Activity android:name=".C"/>

結(jié)果:

task1 task2
A B

前面步驟和上面一樣厚满,最后轉(zhuǎn)到B需要清空B之上的activity

注意:
不同的taskAffinity 在長按home恢復(fù)的時(shí)候是分開顯示的,如果從用戶的角度來看,一個(gè) .apk 文件包含多個(gè)“應(yīng)用”豪筝,需要使用 taskAffinity 屬性將不同關(guān)聯(lián)分配給與每個(gè)“應(yīng)用”相關(guān)的 Activity痰滋。


taskAffinity 在兩種情況下生效:

  • FLAG_ACTIVITY_NEW_TASK

singleTask,SingleInstance 也相當(dāng)于包含了這個(gè)flag

  • android:allowTaskReparenting="true"

Activity 可以從其啟動(dòng)的任務(wù)移動(dòng)到與其具有關(guān)聯(lián)的任務(wù)(如果該任務(wù)出現(xiàn)在前臺(tái))

示例:

應(yīng)用A啟動(dòng)應(yīng)用B的Activity B( 設(shè)置allowTaskReparenting="true"),按home鍵退回桌面啟動(dòng)應(yīng)用B续崖,此時(shí)顯示的并不會(huì)是B的MainActivity敲街,而是顯示Activity B

使用android:taskAffinity這個(gè)屬性時(shí),如果指定的值不含.严望,會(huì)出現(xiàn)這樣的錯(cuò)誤:
Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]
可以考慮采用類似java包名的做法:比如com.xxx.xx

Intent Flag:

  • FLAG_ACTIVITY_SINGLE_TOP
    與 "singleTop" launchMode 值相同的行為多艇。

  • FLAG_ACTIVITY_CLEAR_TOP
    存在則重用并銷毀該位置之上的 Activity.
    注:如果指定 Activity 的啟動(dòng)模式為 "standard",則該 Activity 也會(huì)從堆棧中刪除像吻,并在其位置啟動(dòng)一個(gè)新實(shí)例

  • FLAG_ACTIVITY_NEW_TASK
    根據(jù)Affinity判斷是否需要?jiǎng)?chuàng)建新的Task峻黍,然后再創(chuàng)建新的Activity實(shí)例放進(jìn)去复隆。(棧頂級(jí)別的重利用)

  • FLAG_ACTIVITY_NO_HISTORY
      如果設(shè)置,新的Activity將不再歷史stack中保留姆涩。用戶一離開它挽拂,這個(gè)Activity就關(guān)閉了。這也可以通過XML設(shè)置noHistory

注意: FLAG_ACTIVITY_NEW_TASK+FLAG_ACTIVITY_CLEAR_TOP 才等于singleTask.

清理返回棧

默認(rèn):如果用戶長時(shí)間離開任務(wù)骨饿,則系統(tǒng)會(huì)清除所有 Activity 的任務(wù)亏栈,根任務(wù)除外。 當(dāng)用戶再次返回到任務(wù)時(shí)宏赘,僅恢復(fù)根 Activity绒北。

可以使用下列幾個(gè) Activity 屬性修改此行為:

  • alwaysRetainTaskState
    如果task根 Activity 中將此屬性設(shè)置為 "true",即使在很長一段時(shí)間后察署,所有 Activity 保留在其堆棧中闷游。

  • clearTaskOnLaunch
    如果在task根 Activity 中將此屬性設(shè)置為 "true",則每當(dāng)用戶離開task然后返回時(shí)贴汪,系統(tǒng)都會(huì)將堆棧清除到只剩下根 Activity脐往。

  • finishOnTaskLaunch
    類似于 clearTaskOnLaunch,但它對(duì)單個(gè) Activity 起作用嘶是,而非整個(gè)任務(wù)钙勃。

startActivityForResult

Activity A startActivityForResult -> Activity B

在 Android 4.X 系統(tǒng)上,如果A 為singleTask,SingleInstance或者B為singleTask,SingleInstance則會(huì)在LaunchFlags中加入FLAG_ACTIVITY_NEW_TASK標(biāo)志聂喇,而含有FLAG_ACTIVITY_NEW_TASK標(biāo)志的話辖源,onActivityResult將會(huì)立即接收到一個(gè)cancel的結(jié)果(android 5.0+ 可以正常返回了)

參考:
https://developer.android.com/guide/components/tasks-and-back-stack.html
http://www.cnblogs.com/lwbqqyumidi/p/3775479.html
http://www.reibang.com/p/eceda0e4963e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市希太,隨后出現(xiàn)的幾起案子克饶,更是在濱河造成了極大的恐慌,老刑警劉巖誊辉,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾湃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡堕澄,警方通過查閱死者的電腦和手機(jī)邀跃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛙紫,“玉大人拍屑,你說我怎么就攤上這事】痈担” “怎么了僵驰?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我蒜茴,道長星爪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任粉私,我火速辦了婚禮顽腾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诺核。我一直安慰自己崔泵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布猪瞬。 她就那樣靜靜地躺著,像睡著了一般入篮。 火紅的嫁衣襯著肌膚如雪陈瘦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天潮售,我揣著相機(jī)與錄音痊项,去河邊找鬼。 笑死酥诽,一個(gè)胖子當(dāng)著我的面吹牛鞍泉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肮帐,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咖驮,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了训枢?” 一聲冷哼從身側(cè)響起托修,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恒界,沒想到半個(gè)月后睦刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡十酣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年涩拙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸采。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兴泥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洋幻,到底是詐尸還是另有隱情郁轻,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站好唯,受9級(jí)特大地震影響竭沫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骑篙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一蜕提、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靶端,春花似錦谎势、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至台谍,卻和暖如春须喂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趁蕊。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工坞生, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掷伙。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓是己,卻偏偏與公主長得像,于是被迫代替她去往敵國和親任柜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卒废,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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