Android 進階2:Activity 的 Task 與啟動模式
Android 中的 Task 是什麼
我們知道,一個應用中可能有多個 Activity,而這些 Activity 被以棧的形式管理。當我們新開啟 Activity 或者按返回時,會導致 Activity 的入棧/出棧。
[圖片上傳失敗...(image-b73788-1548163287120)]
有時候我們要進行一些跨應用的操作,比如拍照、P 圖、分享到朋友圈,這一系列操作中會有多個應用的 Activity 互相呼叫,安卓系統是如何管理這些不同應用的 Activity 的呢?
答案你已經猜到了,就是使用 Task。
Task 是指在執行特定任務時與使用者互動的一系列 Activity。 這些 Activity 按照各自的開啟順序排列在堆疊中。
反應在介面上,當我們點選第三個導航選單按鈕,出現在列表中的就是一個個 Task。

在這裡插入圖片描述
從上圖中可看到,一個應用可以包含多個 Task。
(話說回來,微信小程式啟動時應該就是新建一個 Task,這樣在列表中就可以獨立於微信存在。)
應用中的 Task 名預設為包名,我們可以使用 taskAffinity 標籤在 AndroidManifest.xml 中指定某個 Activity 要屬於的 Task 名稱:
<activity android:name=".activity.launchmode.SingleTaskActivity" android:label="singleTask" android:launchMode="singleTask" android:taskAffinity="top.shixinzhang.task2"/>
裝置主螢幕是大多數 Task 的起點。當用戶觸控應用啟動器中的圖示(或主螢幕上的快捷方式)時,該應用的 Task 將出現在前臺。
如果應用 Task 不存在(應用最近未曾使用),則會建立一個新 Task,並且該應用的“主”Activity 將作為堆疊中的根 Activity 開啟。
正如我們的日常體驗,使用者通過按“Home” 鍵離開任務時,當前 Activity 將停止且其 Task 會進入後臺。
[圖片上傳失敗...(image-3ba444-1548163287121)]
系統將保留 Task 中每個 Activity 的狀態。如果使用者稍後通過選擇開始任務的啟動器圖示來恢復任務,則該 Task 將出現在前臺並恢復執行堆疊頂部的 Activity。
注意:
後臺可以同時執行多個任務。
但是,如果使用者同時執行多個後臺任務,則系統可能會開始銷燬後臺
Activity,以回收記憶體資源,從而導致 Activity 狀態丟失。
非 Activity 型別的 Context (比如ApplicationContext)沒有所謂的任務棧。
標題四種啟動模式
1.standard:標準模式,預設的
- 重複建立多個例項
- 誰啟動了這種模式的 Activity,新 Activity 就會執行在啟動者所在的棧中
-
ApplicationContext 啟動 standard 的 Activity,會報錯
在這裡插入圖片描述
2.singleTop:棧頂複用模式
-
如果位於棧頂則不會重複建立,不呼叫 onCreate 和 onStart,直接呼叫 onNewIntent() 方法
在這裡插入圖片描述
3.singleTask:棧內複用模式
- 只要 Activity 在一個棧中有例項,多次啟動此 Activity 都不會建立例項,也是直接呼叫 onNewIntent()
- 啟動 singleTask 的 Activity 時,系統會先找有沒有想要的任務棧,沒有就新建個任務棧;有就看棧裡有沒有例項
- 棧內有例項,就會把該 Activity 調到棧頂,同時 clearTop(之前在它前面的都被清除)
-
一般用於 MainActivity,因為回到首頁後需要清除之前的頁面
在這裡插入圖片描述
4.singleInstance:棧內唯一
- 就是霸道一點的 singleTask
-
啟動後新建一個任務棧,這個棧裡只會有它一個
在這裡插入圖片描述
標誌位
除了 AndroidManifest 檔案以外,我們也可以在 startActivity() 時,為 Intent add flag 來改變 Activity 的狀態:
Intent intent = new Intent(this, SearchActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
下面是常見的三種與 Task 關聯的標誌位:
FLAG_ACTIVITY_NEW_TASK
- 和 singleTask 還是有一定區別的
- 如果 Activity 對應的 Task 已經存在就不會建立新的 Task,而是把舊的 Task 帶到前臺,同時其中的 Activity也會保持之前的狀態
- 一般用於一個類似“桌面”的 Activity,它的作用就是啟動許多不同於當前 Task 的 Activity
FLAG_ACTIVITY_CLEAR_TOP
- 和 singleTask 還是有一定區別的
- 如果當前 Task 已經有要啟動的 Activity,就不會直接建立新的,但是還要分下面兩種情況
- 如果這個 Activity 的啟動模式是 standard 並且也沒有使用
FLAG_ACTIVITY_SINGLE_TOP,會銷燬已有的,新建 Activity - 如果是其他啟動模式或者使用了 FLAG_ACTIVITY_SINGLE_TOP,就會直接呼叫已有的的 onNewIntent
- 一般結合 FLAG_ACTIVITY_NEW_TASK 使用,達到的效果就和 singleTask 差不多了,比如用於通知欄中啟動Activity ,以達到將 Activity 所在 Task 調到前臺,同時 clearTop 的效果
FLAG_ACTIVITY_SINGLE_TOP
-
和 singleTop 效果一致
[圖片上傳失敗...(image-71e730-1548163287121)]
喜歡的話請幫忙轉發一下能讓更多有需要的人看到吧,有些技術上的問題大家可以多探討一下。

image

image
以上Android資料以及更多Android相關資料及面試經驗可在QQ群裡獲取:936903570。有加群的朋友請記得備註上簡書,謝謝。