工作與返回堆疊

「工作」是指使用者在嘗試執行專案時與其互動的一系列活動 在應用程式中執行某些操作這些活動會排列在名為 返回堆疊

例如電子郵件應用程式 某項活動可能會顯示新訊息清單當使用者選取 訊息,就會開啟新活動以查看該訊息。已新增這項新活動 返回堆疊接著,當使用者輕觸或使用手勢返回時,系統就會啟用該新活動 完成後,就會從堆疊中彈出。

工作及其返回堆疊的生命週期

裝置主畫面是大多數工作的起點。使用者輕觸時 應用程式啟動器或主畫面上的應用程式或捷徑圖示。 應用程式的工作就移到前景如果應用程式沒有任務, 就會建立新工作,而 開啟該應用程式的活動 做為堆疊的根活動

當目前的活動開始另一個活動時,新活動會推送至頂端 且會聚焦先前的活動仍會保留在堆疊中, 已停止。活動停止時,系統會保留活動目前的狀態 存取 API當使用者執行返回動作時,目前活動會是 從堆疊頂端彈出並刪除。 就會恢復先前的活動,並還原其 UI 先前的狀態。

在 堆疊不會重新排列,只會推送至堆疊出現時,才會從堆疊中彈出 由目前的活動啟動,並由使用者關閉 按下返回按鈕或手勢。因此,返回堆疊的運作方式為 最後一步物件結構圖 1 顯示 將活動推送到返回堆疊中,並從返回堆疊中彈出。

圖 1. 代表 中每個新活動 工作會將項目新增至返回堆疊。使用者輕觸或手勢時 返回,系統會刪除目前的活動以及先前的活動 履歷繼續播放。

使用者持續輕觸或手勢返回時,堆疊中的每個活動 直到使用者返回首頁為止 或工作開始時正在執行的活動。全部 活動會從堆疊中移除,任務就不再存在。

根啟動器活動的返回輕觸行為

根啟動器活動是指宣告意圖 篩選並同時使用 ACTION_MAINCATEGORY_LAUNCHER。 這些活動是獨一無二的,因為是進入應用程式的進入點 應用程式啟動器,並用於啟動工作

當使用者輕觸或手勢返回根啟動器活動時,系統會 以不同的方式處理事件 裝置正在執行。

Android 11 以下版本的系統行為
系統完成活動。
Android 12 以上版本的系統行為

系統會將活動及其工作移至背景 結束活動。此行為符合系統預設的系統行為 使用主畫面按鈕或手勢離開應用程式。

在大多數情況下,這個行為代表使用者可更快繼續使用您的應用程式 暖機狀態,而不是 而不需要從冷卻系統 狀態

如果需要提供自訂返回瀏覽功能, 建議您使用 AndroidX Activity API,不要覆寫 onBackPressed()。AndroidX Activity API 會自動遵循 在沒有元件攔截系統時,應採取適當的系統行為 返回。

不過,如果您的應用程式 處理 onBackPressed() 返回導覽並完成活動,請更新實作以呼叫 改為在 super.onBackPressed()前完成撥號中 super.onBackPressed() 會在發生以下情況時,將活動及其任務移至背景 並可提供更一致的瀏覽體驗 跨應用程式

背景和前景工作

圖 2. 兩項工作:工作 B 獲得使用者互動 前景,而工作 A 在背景中等待 繼續播放。

工作是連貫的單元,當使用者開始 或前往主畫面。在背景執行時 任務就會停止,但工作的返回堆疊維持不變,工作 就會失去焦點,而發生另一項工作時就會失去焦點,如圖 2 所示。A 罩杯 之後工作便可返回前景,讓使用者接續之前的進度 關閉。

以目前的工作 A 來說 其堆疊中有三個活動,包括目前活動下的兩個活動:

  1. 使用者使用主畫面按鈕或手勢,然後從以下應用程式啟動新的應用程式: 應用程式啟動器。

    主畫面出現時,任務 A 會進入背景。並 應用程式啟動後,系統會使用自身的堆疊啟動該應用程式 (工作 B) 的工作 活動。

  2. 使用者與應用程式互動後,再次返回主畫面並選取 先前啟動工作 A 的應用程式。

    現在,工作 A 移到前景 - 堆疊中的所有三個活動 ,而堆疊頂端的活動會繼續恢復。此時, 使用者也可以前往主畫面並選取應用程式圖示,切換回工作 B 啟動該工作,或從 Recents 螢幕

,瞭解如何調查及移除這項存取權。

多個活動例項

圖 3. 單一活動可以為多項活動執行個體化 時間。

因為如果您的應用程式不會重新安排返回堆疊中的活動 讓使用者從多項活動開始特定活動、 建立該活動的例項並推送至堆疊上 將之前的所有活動例項都移到最上方因此, 應用程式中的活動可能會多次例項化,即便來自不同位置 如圖 3 所示

如果使用者使用返回功能 系統會依照按鈕或手勢,依序顯示活動例項 每個物件開啟時都有自己的 UI 狀態不過,您可以修改 如果不想將活動重複例項化,就應採取這個做法。學習新知 詳情請參閱管理 工作

多視窗環境

當應用程式在多視窗模式內同時執行時 Android 7.0 (API) 支援的環境 24 級) 以上版本,系統會分別管理每個時段的工作。每項 視窗可包含多個工作執行平台的 Android 應用程式也同樣適用 Chromebook:系統會在線上管理工作或工作群組 計費方式

生命週期回顧

如何總結活動與工作的預設行為:

  • 當活動 A 啟動活動 B 時,活動 A 會被停止,只是系統停止。 保留其狀態,例如捲動位置,以及在表單中輸入的任何文字。如果 在活動 B、活動 A 中,使用者輕觸或使用返回手勢 隨著狀態還原而恢復運作

  • 使用者使用主畫面按鈕或手勢離開工作時, 活動停止,且其工作會在背景執行。系統會保留 工作中每個活動的狀態。使用者之後繼續執行工作 選取啟動工作的啟動器圖示後,工作會變成 並恢復堆疊頂端的活動。

  • 如果使用者輕觸或向後做出手勢,系統就會彈出目前活動 再加以刪除系統會繼續處理堆疊中的先前的活動。時間 活動刪除後,系統不會保留該活動的狀態。

    根啟動器活動的行為不同 當您的應用程式在搭載 Android 12 以上版本的裝置上執行時。

  • 活動可以多次例項化,即使是來自其他工作也是如此。

,瞭解如何調查及移除這項存取權。

管理工作

Android 會透過宣告內容 所有活動都是在同一任務中連續開始 堆疊。這項功能適用於大多數應用程式, 活動與工作之間的關係,或活動背面的方式

然而,您可能會決定中斷一般行為。 舉例來說,您可能希望應用程式中的活動在 已開始 而不是置於目前的任務內或者,在您發起 您可能會想轉送現有的實例 在返回堆疊的頂部建立新的執行個體。或者,您 您希望返回堆疊清除所有活動 (根活動除外) 使用者離開工作時。

也可以使用 <activity> 資訊清單元素 在您傳入的意圖中 startActivity()

以下是可用來管理工作的主要 <activity> 屬性:

您可以使用下列主要意圖標記:

以下各節討論如何使用這些資訊清單屬性 和意圖旗標,定義活動與任務之間的關聯以及工作方式 並在返回堆疊中執行

也討論了工作和活動的注意事項 代表和管理。通常,您可以讓 系統會定義您的工作和活動在 「最近使用」畫面,您不需要修改這項行為。如要 資訊,請參閱「最近使用畫面」。

定義啟動模式

啟動模式可讓您定義如何與活動的新例項建立關聯 目前的任務您可以透過兩種方式定義啟動模式,詳情請參閱 下文將深入說明

因此,如果活動 A 啟動了活動 B,活動 B 可以在資訊清單中定義 以及活動 A 如何與目前任務建立關聯,而活動 A 可以使用意圖旗標。 ,要求活動 B 如何與目前工作建立關聯。

如果兩者皆是 活動會定義活動 B 如何與任務建立關聯,然後活動 A 的 如意圖中定義的要求,將會處理活動 B 的請求,如 所定義屬性

使用資訊清單檔案定義啟動模式

在資訊清單檔案中宣告活動時,您可以指定 活動會透過 <activity> 元素的 launchMode 屬性。

有五種啟動模式可以指派給 launchMode 屬性:

  1. "standard"
    預設模式。系統會在工作中建立新的活動例項 並將意圖轉送到該物件活動可以是 這類執行個體會多次例項化,各執行個體可隸屬於不同的任務 一項工作可以有多個執行個體
  2. "singleTop"
    如果目前工作的頂端已有某個活動例項, 系統就會透過呼叫 onNewIntent() 方法,而不是建立活動的新例項。活動是 這些執行個體可以多次例項化,分屬不同的任務 一項工作可以有多個執行個體 (但僅適用於頂層活動 返回堆疊的「並非」活動的現有例項)。

    舉例來說,假設任務的返回堆疊包含根活動 A 活動 B、C 和 D意圖 發生 D 類型的活動時。如果 D 的 "standard" 啟動方式預設為 就會啟動該類別的新執行個體,而堆疊會變成 A-B-C-D-D。 不過,如果 D 的啟動模式為 "singleTop",則 D 現有的執行個體 透過 onNewIntent() 接收意圖 因為該模組位於堆疊頂端 而堆疊仍是 A-B-C-D如果 另一方面 產生意圖後,系統會新增 B 類型的活動,然後加入新的 B 例項到 即使啟動模式為 "singleTop" 也是如此

  3. "singleTask"
    系統會在新任務的根層級建立活動,或尋找 具有相同相依性的現有任務活動。如果 已有活動,系統就會轉送 向現有執行個體發出意圖 onNewIntent()敬上 方法,而不必建立新執行個體。同時 現有的活動都會遭到刪除
    ,瞭解如何調查及移除這項存取權。
  4. "singleInstance"
    行為與 "singleTask" 相同,唯一差別在於系統不會啟動任何其他 將活動納入容納該例項的任務中。活動一律是 一個工作,且僅限其成員。由此工作階段發起的任何活動在以下位置開啟: 另一項任務。
  5. "singleInstancePerTask"
    活動只能以任務的根活動 (第一個) 形式執行 建立任務的活動,因此只能有一個執行個體 執行此活動的訓練與 singleTask 啟動模式相反 可以在不同任務中啟動多個活動 FLAG_ACTIVITY_MULTIPLE_TASKFLAG_ACTIVITY_NEW_DOCUMENT
,瞭解如何調查及移除這項存取權。

另一個例子是,Android 瀏覽器應用程式宣告網路瀏覽器 指定 singleTask,即可一律在其專屬任務中開啟活動 <activity> 的啟動模式 元素。也就是說,如果您的應用程式發出意圖開啟 Android Vitals 瀏覽器的活動「並非」放在應用程式所在的工作中。 瀏覽器開始新的任務時,如果「瀏覽器」已有一項工作, 背景執行時,該工作會前進來處理新的 意圖。

無論活動是在新任務中開始,還是與 啟動應用程式的活動時,返回按鈕和手勢一律都會 返回之前的活動但是,如果您啟動的活動 會指定 singleTask 啟動模式以及該活動的例項位於 然後將整個工作移到前景到目前為止 返回堆疊則包含 堆疊的頂端圖 4 顯示這種情境。

圖 4. 表示活動如何啟動 模式 "singleTask" 已新增至返回堆疊。如果活動 已經是背景工作的一部分,且有自己的返回堆疊 除了目前的 。

如要進一步瞭解如何在資訊清單檔案中使用啟動模式,請參閱 <activity> 元素說明文件。

使用意圖旗標定義啟動模式

啟動活動時,您可以修改活動的預設關聯 只要在意圖中納入旗標 startActivity()。 可用來修改預設行為的標記如下:

FLAG_ACTIVITY_NEW_TASK

系統會在新任務中啟動活動。如果 活動開始後,系統會將該工作移到前景 且活動會在 onNewIntent()

這產生的行為與 "singleTask" 相同 所討論的 launchMode 值 。

FLAG_ACTIVITY_SINGLE_TOP

如果正在啟動的活動是目前活動,請在畫面上方 則現有的執行個體會收到對 onNewIntent(),而不是建立新的活動例項。

這產生的行為與 "singleTop" 相同 上一節討論的 launchMode 值。

FLAG_ACTIVITY_CLEAR_TOP

如果正在啟動的活動已在目前的任務中執行, 而不是啟動該活動的新例項: 系統會銷毀其基礎上的所有其他活動這麼做的目的在於 傳送到已恢復的活動執行個體 onNewIntent()

launchMode 屬性沒有會產生這種行為的值。

FLAG_ACTIVITY_CLEAR_TOP 最常與以下參數搭配使用: FLAG_ACTIVITY_NEW_TASK。搭配使用時,這些旗標 在其他工作中找出現有活動並排入該位置 並能回應意圖

處理興趣相似目標對象

相依性會指出活動「偏好」哪項工作所有資源變更者: 根據預設,同一應用程式中的所有活動都具有彼此的相依性: 他們「偏好」因為在同一個工作中

不過,您可以修改活動的預設相依性。定義的活動 同一應用程式中定義的不同應用程式可能會共用興趣相似目標對象,以及相同的活動 也可以指派給不同的任務相依性

您可以使用 taskAffinity 修改活動的相依性 <activity> 的屬性 元素。

taskAffinity 屬性採用的字串值不得與 預設套件名稱 (在 <manifest> 中宣告) 元素,因為系統會使用該名稱識別預設工作 建立依附關係

興趣相似目標對像在兩種情況下會發揮作用:

  1. 當啟動活動的意圖含有 FLAG_ACTIVITY_NEW_TASK敬上 旗標。

    根據預設,新活動會啟動到 打給 startActivity()。 與呼叫端相同的返回堆疊上。

    不過,如果傳遞至 startActivity() 的意圖包含 FLAG_ACTIVITY_NEW_TASK 旗標,系統會尋找其他任務來存放新活動。這通常 這是一項新工作但其實並沒有硬性規定。如果有 與新活動擁有相同相依性的現有任務,也就是活動 就會啟動到該任務中如果不是,則會開始新的工作。

    如果此旗標促使活動開始新任務,而使用者使用該標記 主畫面按鈕或手勢:使用者可透過特定方式離開應用程式 返回工作通知管理工具等部分實體 一律在外部工作中啟動活動,一律不在其本身範圍內 他們一律會將 FLAG_ACTIVITY_NEW_TASK 放入傳入的意圖 startActivity()

    如果外部實體可能是 使用這個標記可以叫用您的活動,請注意,使用者 藉此返回 例如顯示啟動器圖示、 代表工作 CATEGORY_LAUNCHER敬上 意圖篩選器詳情請參閱「開始工作」一節。

  2. 當活動具有 allowTaskReparenting 時 屬性設為 "true"

    在此情況下,活動可以從啟動的工作移至其擁有的工作 這個依附元件在工作進入前景時具有相依性。

    舉例來說,假設某項活動回報天氣狀況 所選城市是旅遊應用程式的一部分。具有相同的興趣相似目標對象 和同個應用程式中的其他活動一樣、預設的應用程式相依性,你還能 改為使用這個屬性重新指定上層資源

    當您有一項活動啟動 天氣預報程式活動時,最初與你的 活動。不過,當旅遊應用程式的工作移至前景時, 並將天氣報告程式活動重新指派給該任務,並顯示在其中。

,瞭解如何調查及移除這項存取權。

清除返回堆疊

如果使用者長時間離開工作,系統會將所有工作 除了根活動以外使用者返回工作時 只會還原根活動系統會根據 假設 放棄了使用者的長時間工作 然後返回工作開始新的內容。

您可以利用某些活動屬性來修改這項行為:

alwaysRetainTaskState
在任務的根活動中,將此屬性設為 "true" 後, 不會發生剛才描述的預設行為。這項工作會保留 追蹤很長時間的活動。
clearTaskOnLaunch

在任務根活動中將此屬性設為 "true" 時,任務就會顯示 每當使用者離開任務時 即可。換句話說,這與 alwaysRetainTaskState。 當使用者離開 不用太久

finishOnTaskLaunch

這項屬性就像 clearTaskOnLaunch 但它只會處理單一活動,而非整個任務這也可能導致 完成的所有活動 (根活動除外)。設為 "true",則活動只會在目前工作階段中屬於任務的一部分。 如果使用者在離開後返回工作,這項工作將不再顯示。

開始工作

您可以為活動提供意圖,將活動設為任務的進入點 以 "android.intent.action.MAIN" 作為指定動作,且 "android.intent.category.LAUNCHER" 指定為指定類別:

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

這類意圖篩選器會使活動的圖示和標籤 顯示在應用程式啟動器中,方便使用者啟動活動,並 都能返回這項工作建立的工作。

第二項能力至關重要。使用者必須能夠離開工作, 稍後再使用這個活動啟動器。有鑑於此,您只能使用 兩者 將活動標示為一律啟動任務的啟動模式 "singleTask""singleInstance",當活動有 ACTION_MAINCATEGORY_LAUNCHER 篩選。

舉例來說,如果缺少篩選器,可能會發生什麼情況: 意圖會啟動 "singleTask" 活動、啟動新的任務,以及使用者 會花費一些時間完成該項工作接著使用首頁按鈕或 手勢。工作現已傳送至背景,無法查看。現在使用者 無法返回工作,因為應用程式未顯示相關內容 啟動器。

如果您不希望使用者返回 活動,請設定 <activity> 元素的 finishOnTaskLaunch"true"。詳情請參閱「清除返回堆疊」一節。

關於工作和活動的表示及管理的詳細資訊 您可以在 [最近使用] 畫面中前往 [最近] 螢幕

其他資源