Activity的任務(wù)棧Task以及啟動(dòng)模式與Intent的Flag詳解

什么是任務(wù)棧(Task)

官方文檔是這么解釋的

任務(wù)是指在執(zhí)行特定作業(yè)時(shí)與用戶交互的一系列 Activity茁裙。 這些 Activity 按照各自的打開順序排列在堆棧(即“返回棧”)中。

其實(shí)就是以棧的結(jié)構(gòu)(先進(jìn)后出)將依次打開的activity記錄.

為什么要用任務(wù)棧

為了記錄用戶開啟了那些activity根悼,記錄這些activity開啟的先后順序彤叉,google引入任務(wù)棧(task stack)概念,幫助維護(hù)好的用戶體驗(yàn)棉胀。

如何查看當(dāng)前系統(tǒng)的任務(wù)棧

手機(jī)中 --> 長(zhǎng)按home或者多任務(wù)鍵會(huì)進(jìn)到 概覽屏幕 的一個(gè)界面
命令行中 --> adb shell dumpsys activity

概覽屏幕(Overview Screen)

概覽屏幕(也稱為最新動(dòng)態(tài)屏幕法瑟、最近任務(wù)列表或最近使用的應(yīng)用)是一個(gè)系統(tǒng)級(jí)別 UI,其中列出了最近訪問過的Activity和任務(wù)唁奢。 用戶可以瀏覽該列表并選擇要恢復(fù)的任務(wù)霎挟,也可以通過滑動(dòng)清除任務(wù)將其從列表中刪除。 對(duì)于 Android 5.0 版本(API 級(jí)別 21)麻掸,包含多個(gè)文檔的同一 Activity 的多個(gè)實(shí)例可能會(huì)以任務(wù)的形式顯示在概覽屏幕中酥夭。例如,Google Drive 可能對(duì)多個(gè) Google 文檔中的每個(gè)文檔均執(zhí)行一個(gè)任務(wù)脊奋。每個(gè)文檔均以任務(wù)的形式顯示在概覽屏幕中熬北。

Task中activity的特點(diǎn):

  1. 可以來自不同的app
  2. 可以運(yùn)行在不同進(jìn)程

影響Task的activity的屬性和Intent標(biāo)識(shí)

Activity的屬性:

  1. launchMode
  2. taskAffinity
  3. allowTaskReparenting
  4. clearTaskOnLaunch
  5. alwaysRetainTaskState
  6. finishOnTaskLaunch

Intent的標(biāo)識(shí)(四個(gè)與task直接關(guān)系的):

  1. FLAG_ACTIVITY_NEW_TASK
  2. FLAG_ACTIVITY_CLEAR_TOP
  3. FLAG_ACTIVITY_SINGLE_TOP
  4. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    ...

什么是Activity的啟動(dòng)模式(LaunchMode)

啟動(dòng)模式簡(jiǎn)單地說就是Activity啟動(dòng)時(shí)的策略,在AndroidManifest.xml中的標(biāo)簽的android:launchMode屬性設(shè)置
啟動(dòng)模式有4種诚隙,分別為standard讶隐、singleTop、singleTask久又、singleInstance巫延;

這四種模式影響了Activity所在的任務(wù)棧.

使用方式:在清單文件中activity的節(jié)點(diǎn)加入launchMode屬性

  1. standard

默認(rèn)模式,當(dāng)Intent發(fā)送的時(shí)候,每次打開都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例。
如果app1啟動(dòng)了app2的activity,則會(huì)將APP2的activity自動(dòng)加入到app1的activity所在的task

在5.0中,也沒有出現(xiàn)跨應(yīng)用會(huì)在新的task中啟動(dòng)activity的的情況 與該文章Understand Android Activity's launchMode: standard, singleTop, singleTask and singleInstance描述的并不太一樣

  1. singleTop

幾乎和standard模式一模一樣籽孙,一個(gè)singleTop的Activity的實(shí)例可以無限多烈评,唯一的區(qū)別是如果當(dāng)前activity已經(jīng)在棧頂?shù)脑挘瑒t不會(huì)再創(chuàng)建一個(gè)新的activity犯建,通過onNewIntent()將intent發(fā)送給現(xiàn)有的Activity讲冠。

  1. singleTop模式,只在當(dāng)前任務(wù)棧中生效.
  2. 如果通過startActivityForResult啟動(dòng)一個(gè)設(shè)置了singleTop的activity,singleTop模式將無效(不知道為什么網(wǎng)上很多人說該設(shè)置該singleTop也會(huì)導(dǎo)致立即在onActivityResult中返回一個(gè)為cancel的resultCode,實(shí)測(cè)下來4.x,5.x的版本都沒問題)

onNewIntent()使用Tips

1. 方法體中需手動(dòng)調(diào)用setIntent(intent),否則之后的getIntent()獲取的都是舊的intent對(duì)象;
2. 被onNewIntent方式打開的activity,對(duì)生命周期的影響.
 1. 之前activity是resume狀態(tài),onNewIntent()后只會(huì)調(diào)用onResume()方法
  2. 否則按照 `onNewIntent->onRestart->onStart->onResume->.`

應(yīng)用場(chǎng)景

這種啟動(dòng)模式的用例之一就是搜索功能享幽。假設(shè)我們創(chuàng)建了一個(gè)搜索框辆憔,點(diǎn)擊搜索的時(shí)候?qū)?dǎo)航到一個(gè)顯示搜索結(jié)果列表的SearchActivity中,為了更好的用戶體驗(yàn)掸读,這個(gè)搜索框一般也會(huì)被放到SearchActivity中玻熙,這樣用戶想要再次搜索就不需要按返回鍵否彩。
想像一下,如果每次顯示搜索結(jié)果的時(shí)候我們都啟動(dòng)一個(gè)新的activity嗦随,10次搜索10個(gè)activity列荔,那樣當(dāng)我們想返回最初的那個(gè)activity的時(shí)候需要按10次返回敬尺。
所以我們應(yīng)該這樣,如果棧頂已經(jīng)有一個(gè)SearchActivity贴浙,我們將Intent發(fā)送給現(xiàn)有的activity砂吞,讓它來更新搜索結(jié)果。這樣就只會(huì)有一個(gè)在棧頂?shù)腟earchActivity崎溃,只需點(diǎn)一次back就可以回到之前的activity蜻直。
不管怎樣,singleTop和它的調(diào)用者處在一個(gè)任務(wù)中袁串。如果你想要讓intent發(fā)送給另一個(gè)任務(wù)中處于棧頂?shù)腁ctivity概而,是不行的。
而當(dāng)Intent來自于另外一個(gè)應(yīng)用的時(shí)候囱修,新的Activity的啟動(dòng)方式和standard模式是一致的赎瑰。

  1. singleTask

首先要引出taskAffinity這個(gè)activity的屬性.

把TASK比作一個(gè)班級(jí),affinity則更像是這個(gè)班級(jí)的班級(jí)名稱,學(xué)校比做系統(tǒng),Activity更像是班級(jí)里的學(xué)生

*如果沒有對(duì)activity設(shè)置該屬性的話,默認(rèn)為application的**taskAffinity**,如果application也沒有設(shè)置,則為app的包名.*

啟動(dòng)一個(gè)singleTask模式的activity,會(huì)首先在系統(tǒng)中找與它的taskAffinity屬性一致的任務(wù)棧,

  1. 先找task

    1. 沒有特別指定taskAffinity,則為當(dāng)前的task
    2. 如果指定了taskAffinity,先在系統(tǒng)中查找task,如果找不到則創(chuàng)建一個(gè)新的task,將activity作為root放置其中.
  2. 啟動(dòng)Activity

如果第一步中的task中已經(jīng)有了這個(gè)activity的實(shí)例,則將其顯示(**將task中該activity上層的activity都pop出任務(wù)棧**)蔚袍,同時(shí)intent將被通過onNewIntent()發(fā)送. 

對(duì)設(shè)置為singleTask的activity的總結(jié)

1. `并不是一定會(huì)在新的任務(wù)棧中打開.(具體要根據(jù)taskAffinity(班級(jí)名稱)看系統(tǒng)(學(xué)校)中是否已經(jīng)有這個(gè)任務(wù)棧(班級(jí))了).`
2. `如果需要在新的任務(wù)棧中啟動(dòng),就需要為activity設(shè)置獨(dú)立的taskAffinity.`
3. `如果任務(wù)棧中已存在該activity,那么會(huì)將上層的所有activity彈出.`
4. `如果當(dāng)前activity是在新的任務(wù)棧中打開的話,那么之后在該activity中通過默認(rèn)方式啟動(dòng)的activity都在這個(gè)新的任務(wù)棧(這個(gè)跟我們接下里要講的singleInstance有區(qū)別)`
5. `如果是在新的任務(wù)棧中啟動(dòng)的話,最近任務(wù)列表(android的多任務(wù)鍵按下后)會(huì)有兩個(gè),可選擇返回至相應(yīng)的任務(wù)棧`
6. 當(dāng)作為startActivityForResult啟動(dòng)的目標(biāo)時(shí)
    1. 4.x版本.會(huì)立刻在上個(gè)activity中onActivityResult中返回一個(gè)為cancel的resultCode.(不管新的activity是否是在新的任務(wù)棧中啟動(dòng))
    2. 5.x版本.不管是否定義了taskAffinity,都會(huì)把將要被啟動(dòng)的activity的啟動(dòng)模式忽略,onActivityResult方法會(huì)正诚绶叮回調(diào)

應(yīng)用場(chǎng)景

該模式的使用場(chǎng)景多類似于郵件客戶端的收件箱或者社交應(yīng)用的時(shí)間線Activity(朋友圈)

  1. singleInstance

與 "singleTask" 基本相同,總是該Activity始終是其所在task中唯一僅有的成員;之后在該activity中啟動(dòng)的activity都不會(huì)在其所在的task中.

總結(jié)

  1. 當(dāng)作為startActivityForResult啟動(dòng)的目標(biāo)時(shí)(下文中的它都是指被啟動(dòng)的activity)
    1. 4.x版本.在新的任務(wù)棧中啟動(dòng),并立刻在啟動(dòng)它的activity中的onActivityResult中返回一個(gè)為cancel的resultCode.singleInstance的特點(diǎn)還在
    2. 5.x版本.并不會(huì)在新的任務(wù)棧中啟動(dòng),而是直接在當(dāng)前任務(wù)棧啟動(dòng)(會(huì)出現(xiàn)多個(gè)實(shí)例),啟動(dòng)它的activity的onActivityResult方法會(huì)在它關(guān)閉后,正称⊙剩回調(diào).重點(diǎn)是被它開啟的activity將運(yùn)行在另外一個(gè)新的任務(wù)棧中.

應(yīng)用場(chǎng)景

  1. 呼叫來電界面 InCallScreen

常用的Intent Flag

  1. FLAG_ACTIVITY_NEW_TASK

> 文檔摘錄: When using this flag, if a task is already running for the activity you are now starting, then a new activity will not be started; instead, the current task will simply be brought to the front of the screen with the state it was last in. See FLAG_ACTIVITY_MULTIPLE_TASK for a flag to disable this behavior.`當(dāng)使用這個(gè)flag時(shí),如果task中已經(jīng)有了你要啟動(dòng)的activity的話,就不再啟動(dòng)一個(gè)新的activity了,當(dāng)前**task**會(huì)被帶到前臺(tái)(不管這個(gè)activity是否在前臺(tái),有可能activity上邊還壓有別的activity).如果不想要這種行為,可以用FLAG_ACTIVITY_MULTIPLE_TASK.

> 比如說原來?xiàng)V星闆r是`A,B,C`,在`C`中啟動(dòng)`D`晋辆,如果在Manifest.xml文件中給`D`添加了Affinity的值和`C`所在的Task中的不一樣的話,則會(huì)在新標(biāo)記的Affinity所存在的Task中看是否這個(gè)activity已經(jīng)啟動(dòng),如果沒啟動(dòng),則直接將activity啟動(dòng).如果啟動(dòng)了,直接將`D`所在的task帶入到前臺(tái);如果是默認(rèn)的或者指定的Affinity和Task一樣的話宇整,就和標(biāo)準(zhǔn)模式一樣了啟動(dòng)一個(gè)新的Activity.
  1. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | FLAG_ACTIVITY_NEW_DOCUMENT (API21)

> FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET在API 21的時(shí)候,被FLAG_ACTIVITY_NEW_DOCUMENT代替

如果一個(gè)Intent中包含此屬性瓶佳,則它轉(zhuǎn)向的那個(gè)Activity以及在那個(gè)Activity其上的所有Activity都會(huì)在task重置時(shí)被清除出task。當(dāng)我們將一個(gè)后臺(tái)的task重新回到前臺(tái)時(shí)鳞青,系統(tǒng)會(huì)在特定情況下為這個(gè)動(dòng)作附帶一個(gè)FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記霸饲,意味著必要時(shí)重置task,這時(shí)FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET就會(huì)生效臂拓。經(jīng)過測(cè)試發(fā)現(xiàn)厚脉,對(duì)于一個(gè)處于后臺(tái)的應(yīng)用,如果在launcher中點(diǎn)擊應(yīng)用胶惰,這個(gè)動(dòng)作中含有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記傻工,長(zhǎng)按Home鍵,然后點(diǎn)擊最近記錄孵滞,這個(gè)動(dòng)作不含F(xiàn)LAG_ACTIVITY_RESET_TASK_IF_NEEDED標(biāo)記,所以前者會(huì)清除中捆,后者不會(huì).
應(yīng)用場(chǎng)景:
比如我們?cè)趹?yīng)用主界面要選擇一個(gè)圖片,然后我們啟動(dòng)了圖片瀏覽界面坊饶,但是把這個(gè)應(yīng)用從后臺(tái)恢復(fù)到前臺(tái)時(shí)泄伪,為了避免讓用戶感到困惑,我們希望用戶仍然看到主界面匿级,而不是圖片瀏覽界面蟋滴,這個(gè)時(shí)候我們就要在轉(zhuǎn)到圖片瀏覽界面時(shí)的Intent中加入此標(biāo)記

5.0之前,Activity1用該flag啟動(dòng)Activity2在OverviewScreen中是沒有分開的.也就是說如果back到后臺(tái)后,再通過launcher中點(diǎn)擊app的icon進(jìn)入,將直接進(jìn)入Activity1,并且無法回到activity2的界面.
5.0之后,OverviewScreen中,會(huì)將兩個(gè)activity分開.可以返回指定想要的activity.
  1. FLAG_ACTIVITY_MULTIPLE_TASK

> 不建議使用此標(biāo)記染厅,除非你自己實(shí)現(xiàn)了應(yīng)用程序的啟動(dòng)器。結(jié)合FLAG_ACTIVITY_NEW_TASK這個(gè)標(biāo)記脓杉,即使要啟動(dòng)的activity已經(jīng)存在一個(gè)task在運(yùn)行糟秘,也會(huì)新啟動(dòng)一個(gè)task來運(yùn)行要啟動(dòng)的activity

系統(tǒng)缺省是不帶任務(wù)管理器的,所以當(dāng)你使用這個(gè)標(biāo)簽的時(shí)候球散,你必須確保你能從你啟動(dòng)的task中返回回來。
如果沒有設(shè)置FLAG_ACTIVITY_NEW_TASK散庶,這個(gè)標(biāo)記被忽略

  1. FLAG_ACTIVITY_CLEAR_TASK

> 文檔原文:`If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the activity to be cleared before the activity is started. That is, the activity becomes the new root of an otherwise empty task, and any old activities are finished. This can only be used in conjunction with FLAG_ACTIVITY_NEW_TASK.` 
個(gè)人翻譯:`這個(gè)flag會(huì)導(dǎo)致,在這個(gè)activity啟動(dòng)之前,任何與該activity相關(guān)的task都會(huì)被清除.也就是說,這個(gè)activity將會(huì)是一個(gè)空task的最底部的activity,之前所有的activity都會(huì)被finish掉.這個(gè)flag只能和FLAG_ACTIVITY_NEW_TASK結(jié)合使用.`
比如說原來?xiàng)V星闆r是`A,B,C,D`,在D中啟動(dòng)B(加入該flag),中間過程是`A,B,C`依次destory,D先onPause,隨后BonCreate,onStart,onResume.D再onStop,onDestory.最后只有一個(gè)B在棧底.(無論taskAffinity..?)
  1. FLAG_ACTIVITY_SINGLE_TOP

> 相當(dāng)于launchMode中的singleTop蕉堰,比如說原來?xiàng)V星闆r是`A,B,C,D`,在D中啟動(dòng)D(加入該flag),棧中的情況還是`A,B,C,D`.
  1. FLAG_ACTIVITY_CLEAR_TOP

> 不同于launchMode中的singleTask,比如說原來?xiàng)V星闆r是`A,B,C,D`,在D中啟動(dòng)B(加入該flag), 棧中的情況將為`A,B`.但是B會(huì)重新onCreate()...,并沒有執(zhí)行onNewIntent().如果希望與singleTask效果相同,可以加入`FLAG_ACTIVITY_SINGLE_TOP`.
  1. FLAG_ACTIVITY_REORDER_TO_FRONT

> 這個(gè)跟上邊FLAG_ACTIVITY_BROUGHT_TO_FRONT的是容易混淆的.比如說原來?xiàng)V星闆r是`A,B,C,D`,在D中啟動(dòng)B(加入該flag)悲龟,棧中的情況會(huì)是`A,C,D,B`.(調(diào)用onNewIntent())
  1. FLAG_ACTIVITY_BROUGHT_TO_FRONT

> 這個(gè)是最容易讓人誤解的flag了.跟FLAG_ACTIVITY_REORDER_TO_FRONT是不一樣的.不是由我們一般開發(fā)者使用的flag.
文檔中解釋:This flag is not normally set by application code, but set for you by the system as described in the launchMode documentation for the singleTask mode.
  1. FLAG_ACTIVITY_NO_HISTORY

> A啟動(dòng)B(加入該Flag),B啟動(dòng)C.在C返回,將直接返回到A.B在A正常onResume后,才會(huì)調(diào)用`onStop,onDestory...`
而且被這個(gè)flag啟動(dòng)的activity,它的onActivityResult()永遠(yuǎn)不會(huì)被調(diào)用
  1. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

> 我所理解的,加了這個(gè)flag啟動(dòng)的activity所在的task(必須是該task中最底部的activity)將不會(huì)在多任務(wù)界面出現(xiàn).一般配合FLAG_ACTIVITY_NEW_TASK使用,這樣新的任務(wù)棧,在最近使用列表中,就不會(huì)出現(xiàn).
  1. FLAG_ACTIVITY_FORWARD_RESULT

> 多個(gè)Activity的值傳遞屋讶。A通過startActivityForResult啟動(dòng)B,B啟動(dòng)C,但B為過渡頁可以finish了须教,A在期望C把結(jié)果返回.這種情況,B可以在啟動(dòng)C的時(shí)候加入該flag.
  1. FLAG_ACTIVITY_NO_USER_ACTION

> 禁止activity調(diào)用onUserLeaveHint()皿渗。
  onUserLeaveHint()作為activity周期的一部分,它在activity因?yàn)橛脩粢D(zhuǎn)到別的activity而退到background時(shí)使用轻腺。比如乐疆,在用戶按下Home鍵(用戶的操作),它將被調(diào)用贬养。比如有電話進(jìn)來(不屬于用戶的操作)挤土,它就不會(huì)被調(diào)用。注意:通過調(diào)用finish()時(shí)該activity銷毀時(shí)不會(huì)調(diào)用該函數(shù)误算。 
  1. FLAG_ACTIVITY_RETAIN_IN_RECENTS (API21)

> 與activity設(shè)置autoRemoveFromRecents = false屬性效果一樣.是指當(dāng)前activity銷毀后,是否還在概覽屏幕中顯示.(5.0之后生效)
  1. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

> 一般為系統(tǒng)使用,比如要把一個(gè)應(yīng)用從后臺(tái)移到前臺(tái),有兩種方式:從多任務(wù)列表中恢復(fù)(不包含該flag);從啟動(dòng)器中點(diǎn)擊icon恢復(fù)(包含該flag);需結(jié)合` FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | FLAG_ACTIVITY_NEW_DOCUMENT (API21)`理解
  1. FLAG_ACTIVITY_PREVIOUS_IS_TOP

> 即 A---> B --->C仰美,若B啟動(dòng)C時(shí)用了這個(gè)標(biāo)志位,那在啟動(dòng)時(shí)B并不會(huì)被當(dāng)作棧頂?shù)腁ctivity儿礼,而是用A做棧頂來啟動(dòng)C咖杂。此過程中B充當(dāng)一個(gè)跳轉(zhuǎn)頁面。

典型的場(chǎng)景是在應(yīng)用選擇頁面蚊夫,如果在文本中點(diǎn)擊一個(gè)網(wǎng)址要跳轉(zhuǎn)到瀏覽器诉字,而系統(tǒng)中又裝了不止一個(gè)瀏覽器應(yīng)用,此時(shí)會(huì)彈出應(yīng)用選擇頁面这橙。在應(yīng)用選擇頁面選擇某一款瀏覽器啟動(dòng)時(shí)奏窑,就會(huì)用到這個(gè)Flag。然后應(yīng)用選擇頁面將自己finish屈扎,以保證從瀏覽器返回時(shí)不會(huì)在回到選擇頁面埃唯。
經(jīng)常與FLAG_ACTIVITY_FORWARD_RESULT 一起使用。

  1. FLAG_ACTIVITY_TASK_ON_HOME

> 該flag啟動(dòng)的activity,點(diǎn)擊返回鍵會(huì)回到launcher.需要與`FLAG_ACTIVITY_NEW_TASK`一起使用,并且`FLAG_ACTIVITY_NEW_TASK`模式生效(參考該屬性)后,該flag才會(huì)起作用.
  1. FLAG_EXCLUDE_STOPPED_PACKAGES

> 設(shè)置之后鹰晨,Intent就不會(huì)再匹配那些當(dāng)前被停止的包里的組件墨叛。如果沒有設(shè)置止毕,默認(rèn)的匹配行為會(huì)包含這些被停止的包。
  1. FLAG_DEBUG_LOG_RESOLUTION

> debug模式可以打印log

Activity的task相關(guān)屬性

參考: 基礎(chǔ)總結(jié)篇之三:Activity的task相關(guān)

  1. allowTaskReparenting

> 這個(gè)屬性用來標(biāo)記一個(gè)Activity實(shí)例在當(dāng)前應(yīng)用退到后臺(tái)后漠趁,是否能從啟動(dòng)它的那個(gè)task移動(dòng)到有共同affinity的task扁凛,“true”表示可以移動(dòng),“false”表示它必須呆在當(dāng)前應(yīng)用的task中闯传,默認(rèn)值為false谨朝。
比如在app1的activityA中打開app2的activity2,按home鍵,回到后臺(tái)后,這時(shí)在launcher中點(diǎn)擊App1,頁面顯示的是app1的activityA(是在此時(shí)將activity2轉(zhuǎn)移到app2的task中).再點(diǎn)擊app2,則顯示的是activity2,點(diǎn)擊back,則會(huì)在app2所在的任務(wù)棧中回退.

需要注意的是,如果app1退居后臺(tái)之后甥绿,沒有再次啟動(dòng)app1字币,而是直接啟動(dòng)app2,將不會(huì)出現(xiàn)以上現(xiàn)象共缕。重新宿主的動(dòng)作發(fā)生在appB再次啟動(dòng)的過程中

  1. alwaysRetainTaskState

> 這個(gè)屬性用來標(biāo)記應(yīng)用的task是否保持原來的狀態(tài)洗出,“true”表示總是保持,“false”表示不能夠保證图谷,默認(rèn)為“false”翩活。此屬性只對(duì)task的根Activity起作用,其他的Activity都會(huì)被忽略便贵。

默認(rèn)情況下菠镇,如果一個(gè)應(yīng)用在后臺(tái)呆的太久例如30分鐘,用戶從主選單再次選擇該應(yīng)用時(shí)嫉沽,系統(tǒng)就會(huì)對(duì)該應(yīng)用的task進(jìn)行清理辟犀,除了根Activity,其他Activity都會(huì)被清除出棧绸硕,但是如果在根Activity中設(shè)置了此屬性之后堂竟,用戶再次啟動(dòng)應(yīng)用時(shí),仍然可以看到上一次操作的界面玻佩。
這個(gè)屬性對(duì)于一些應(yīng)用非常有用出嘹,例如Browser應(yīng)用程序,有很多狀態(tài)咬崔,比如打開很多的tab税稼,用戶不想丟失這些狀態(tài),使用這個(gè)屬性就極為恰當(dāng)垮斯。

  1. clearTaskOnLaunch

> 這個(gè)屬性用來標(biāo)記是否從task清除除根Activity之外的所有的Activity郎仆,“true”表示清除,“false”表示不清除兜蠕,默認(rèn)為“false”扰肌。同樣,這個(gè)屬性也只對(duì)根Activity起作用熊杨,其他的Activity都會(huì)被忽略曙旭。 如果設(shè)置了這個(gè)屬性為“true”盗舰,每次用戶重新啟動(dòng)這個(gè)應(yīng)用時(shí),都只會(huì)看到根Activity桂躏,task中的其他Activity都會(huì)被清除出棧钻趋。
  1. finishOnTaskLaunch

> 與allowReparenting屬性相似,不同之處在于allowReparenting屬性是重新宿主到有共同affinity的task中剂习,而finishOnTaskLaunch屬性是銷毀實(shí)例蛮位。如果這個(gè)屬性和android:allowReparenting都設(shè)定為“true”,則這個(gè)屬性優(yōu)先級(jí)高鳞绕。
  1. documentLaunchMode

#### intoExisting
> 該 Activity 會(huì)對(duì)文檔重復(fù)使用現(xiàn)有任務(wù)土至。這與不設(shè)置 FLAG_ACTIVITY_MULTIPLE_TASK 標(biāo)志、但設(shè)置 FLAG_ACTIVITY_NEW_DOCUMENT 標(biāo)志所產(chǎn)生的效果相同猾昆,如上文的使用 Intent 標(biāo)志添加任務(wù)中所述。

#### always
> 該 Activity 為文檔創(chuàng)建新任務(wù)骡苞,即便文檔已打開也是如此垂蜗。使用此值與同時(shí)設(shè)置 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 標(biāo)志所產(chǎn)生的效果相同。

#### none
> 該 Activity 不會(huì)為文檔創(chuàng)建新任務(wù)解幽。概覽屏幕將按其默認(rèn)方式對(duì)待此 Activity:為應(yīng)用顯示單個(gè)任務(wù)贴见,該任務(wù)將從用戶上次調(diào)用的任意 Activity 開始繼續(xù)執(zhí)行。

#### never
> 該 Activity 不會(huì)為文檔創(chuàng)建新任務(wù)躲株。設(shè)置此值會(huì)替代 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 標(biāo)志的行為(如果在 Intent 中設(shè)置了其中一個(gè)標(biāo)志)片部,并且概覽屏幕將為應(yīng)用顯示單個(gè)任務(wù),該任務(wù)將從用戶上次調(diào)用的任意 Activity 開始繼續(xù)執(zhí)行霜定。

對(duì)于除 none 和 never 以外的值档悠,必須使用 launchMode="standard" 定義 Activity。如果未指定此屬性望浩,則使用 documentLaunchMode="none"辖所。

引用

meizixiongActivity的四種啟動(dòng)模式
android 任務(wù)棧及啟動(dòng)模式
android的task任務(wù)棧
Intent Flag的幾種介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市磨德,隨后出現(xiàn)的幾起案子缘回,更是在濱河造成了極大的恐慌,老刑警劉巖典挑,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酥宴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡您觉,警方通過查閱死者的電腦和手機(jī)拙寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顾犹,“玉大人倒庵,你說我怎么就攤上這事褒墨。” “怎么了擎宝?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵郁妈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我绍申,道長(zhǎng)噩咪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任极阅,我火速辦了婚禮胃碾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筋搏。我一直安慰自己仆百,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布奔脐。 她就那樣靜靜地躺著俄周,像睡著了一般。 火紅的嫁衣襯著肌膚如雪髓迎。 梳的紋絲不亂的頭發(fā)上峦朗,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天排龄,我揣著相機(jī)與錄音波势,去河邊找鬼橄维。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挣郭,可吹牛的內(nèi)容都是我干的迄埃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼侄非,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼流译!你這毒婦竟也來了逞怨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤福澡,失蹤者是張志新(化名)和其女友劉穎叠赦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體除秀,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年泳姐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暂吉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慕的,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出风题,到底是詐尸還是另有隱情嫉父,我是刑警寧澤俯邓,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站鸟整,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篮条。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一赴恨、第九天 我趴在偏房一處隱蔽的房頂上張望伴栓。 院中可真熱鬧,春花似錦钳垮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绢馍。三九已至,卻和暖如春舰涌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舵稠。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工超升, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哺徊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓盈滴,卻偏偏與公主長(zhǎng)得像轿钠,于是被迫代替她去往敵國(guó)和親巢钓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疗垛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

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