Activity的四種LaunchMode

任務(wù)和返回棧

使用android:launchMode="standard|singleInstance|single Task|singleTop"來控制Acivity任務(wù)棧。

任務(wù)棧是一種后進(jìn)先出的結(jié)構(gòu)。位于棧頂?shù)腁ctivity處于焦點(diǎn)狀態(tài),當(dāng)按下back按鈕的時(shí)候,棧內(nèi)的Activity會一個(gè)一個(gè)的出棧,并且調(diào)用其onDestory()方法。如果棧內(nèi)沒有Activity,那么系統(tǒng)就會回收這個(gè)棧,每個(gè)APP默認(rèn)只有一個(gè)棧,以APP的包名來命名.

任務(wù)是指在執(zhí)行特定作業(yè)時(shí)與用戶交互的一系列 Activity。 這些 Activity 按照各自的打開順序排列在堆棧(即返回棧)中。
例如:你在主屏幕中打開一個(gè)應(yīng)用,其實(shí)就是開啟了一個(gè)activity,然后又由這個(gè)activity開啟了一系列其他的activity,這些activity可能屬于同一個(gè)應(yīng)用也可能屬于不同的應(yīng)用。但只要是在這一系列的操作中打開的activity,他們就都處于同一個(gè)Task(任務(wù))當(dāng)中。

設(shè)備的主屏幕是大多數(shù)任務(wù)的起點(diǎn).當(dāng)用戶觸摸應(yīng)用啟動(dòng)器中的圖標(biāo)時(shí),該應(yīng)用的任務(wù)將出現(xiàn)在前臺。 如果應(yīng)用不存在任務(wù)(應(yīng)用最近未曾使用),則會創(chuàng)建一個(gè)新任務(wù),并且該應(yīng)用的“主”Activity 將作為堆棧中的根 Activity 打開。

前臺activity:當(dāng)activity啟動(dòng)另一個(gè)activity時(shí),該新 Activity 會被推送到堆棧頂部,成為焦點(diǎn)所在(前臺activity)。當(dāng)按下back鍵時(shí),系統(tǒng)會將棧頂?shù)腶ctivity銷毀,恢復(fù)前一個(gè)activity。

Paste_Image.png

任務(wù)是一個(gè)有機(jī)整體,當(dāng)用戶開始新任務(wù)或通過“主頁”按鈕轉(zhuǎn)到主屏幕時(shí),可以移動(dòng)到“后臺”,變成后臺任務(wù)。后臺任務(wù)中的activity全部停止,但其返回棧中activity的順序不變。(返回棧中的activity順序永遠(yuǎn)不變)。也就是說,當(dāng)另一個(gè)任務(wù)發(fā)生時(shí),該任務(wù)僅僅失去焦點(diǎn)而已。

Paste_Image.png

Activity 和任務(wù)的默認(rèn)行為總結(jié)如下:

  • 當(dāng) Activity A 啟動(dòng) Activity B 時(shí),Activity A 將會停止,但系統(tǒng)會保留其狀態(tài)(例如,滾動(dòng)位置和已輸入表單中的文本)。如果用戶在處于 Activity B 時(shí)按“返回”按鈕,則 Activity A 將恢復(fù)其狀態(tài),繼續(xù)執(zhí)行。
  • 用戶通過按“主頁”按鈕離開任務(wù)時(shí),當(dāng)前 Activity 將停止且其任務(wù)會進(jìn)入后臺。 系統(tǒng)將保留任務(wù)中每個(gè) Activity 的狀態(tài)。如果用戶稍后通過選擇開始任務(wù)的啟動(dòng)器圖標(biāo)來恢復(fù)任務(wù),則任務(wù)將出現(xiàn)在前臺并恢復(fù)執(zhí)行堆棧頂部的 Activity。
  • 如果用戶按“返回”按鈕,則當(dāng)前 Activity 會從堆棧彈出并被銷毀。 堆棧中的前一個(gè) Activity 恢復(fù)執(zhí)行。銷毀 Activity 時(shí),系統(tǒng)不會保留該 Activity 的狀態(tài)。
  • 即使來自其他任務(wù),Activity 也可以多次實(shí)例化。

四種LaunchMode:

  • standard:默認(rèn)。系統(tǒng)在啟動(dòng) Activity 的任務(wù)中創(chuàng)建 Activity 的新實(shí)例并向其傳送 Intent。Activity 可以多次實(shí)例化,而每個(gè)實(shí)例均可屬于不同的任務(wù),并且一個(gè)任務(wù)可以擁有多個(gè)實(shí)例。
  • singleTop:如果當(dāng)前任務(wù)的頂部已存在 Activity 的一個(gè)實(shí)例,則系統(tǒng)會通過調(diào)用該實(shí)例的 onNewIntent() 方法向其傳送 Intent,而不是創(chuàng)建 Activity 的新實(shí)例。Activity 可以多次實(shí)例化,而每個(gè)實(shí)例均可屬于不同的任務(wù),并且一個(gè)任務(wù)可以擁有多個(gè)實(shí)例(但前提是位于返回棧頂部的 Activity 并不是 Activity 的現(xiàn)有實(shí)例)。**例如,假設(shè)任務(wù)的返回棧包含根 Activity A 以及 Activity B、C 和位于頂部的 D(堆棧是 A-B-C-D;D 位于頂部)。收到針對 D 類 Activity 的 Intent。如果 D 具有默認(rèn)的 "standard" 啟動(dòng)模式,則會啟動(dòng)該類的新實(shí)例,且堆棧會變成 A-B-C-D-D。但是,如果 D 的啟動(dòng)模式是 "singleTop",則 D 的現(xiàn)有實(shí)例會通過 onNewIntent()接收 Intent,因?yàn)樗挥诙褩5捻敳?;而堆棧仍?A-B-C-D。但是,如果收到針對 B 類 Activity 的 Intent,則會向堆棧添加 B 的新實(shí)例,即便其啟動(dòng)模式為 "singleTop"也是如此。
  • singleTask:系統(tǒng)創(chuàng)建新任務(wù)并實(shí)例化位于新任務(wù)底部的 Activity。但是,如果該 Activity 的一個(gè)實(shí)例已存在于一個(gè)單獨(dú)的任務(wù)中,則系統(tǒng)會通過調(diào)用現(xiàn)有實(shí)例的onNewIntent()方法向其傳送 Intent,而不是創(chuàng)建新實(shí)例。一次只能存在 Activity 的一個(gè)實(shí)例。
  • singleInstance:與 "singleTask" 相同,只是系統(tǒng)不會將任何其他 Activity 啟動(dòng)到包含啟動(dòng)模式為singleInstance的實(shí)例的任務(wù)中。該 Activity 始終是其任務(wù)唯一僅有的成員;由此 Activity 啟動(dòng)的任何 Activity 均在單獨(dú)的任務(wù)中打開。

示例

我們再來看另一示例,Android 瀏覽器應(yīng)用聲明網(wǎng)絡(luò)瀏覽器 Activity 應(yīng)始終在其自己的任務(wù)中打開(通過在 <activity>元素中指定 singleTask啟動(dòng)模式)。這意味著,如果您的應(yīng)用發(fā)出打開 Android 瀏覽器的 Intent,則其 Activity 與您的應(yīng)用位于不同的任務(wù)中。相反,系統(tǒng)會為瀏覽器啟動(dòng)新任務(wù),或者如果瀏覽器已有任務(wù)正在后臺運(yùn)行,則會將該任務(wù)上移一層以處理新 Intent。
無論 Activity 是在新任務(wù)中啟動(dòng),還是在與啟動(dòng) Activity 相同的任務(wù)中啟動(dòng),用戶按“返回”按鈕始終會轉(zhuǎn)到前一個(gè) Activity(始終記住這個(gè)邏輯,系統(tǒng)嚴(yán)格按照這個(gè)邏輯來執(zhí)行)。 但是,如果啟動(dòng)指定 singleTask 啟動(dòng)模式的 Activity,則當(dāng)某后臺任務(wù)中存在該 Activity 的實(shí)例時(shí),整個(gè)任務(wù)都會轉(zhuǎn)移到前臺。此時(shí),返回棧包括上移到堆棧頂部的任務(wù)中的所有 Activity。

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容