「工作」是指使用者在嘗試執行專案時與其互動的一系列活動 在應用程式中執行某些操作這些活動會排列在名為 返回堆疊。
例如電子郵件應用程式 某項活動可能會顯示新訊息清單當使用者選取 訊息,就會開啟新活動以查看該訊息。已新增這項新活動 返回堆疊接著,當使用者輕觸或使用手勢返回時,系統就會啟用該新活動 完成後,就會從堆疊中彈出。
工作及其返回堆疊的生命週期
裝置主畫面是大多數工作的起點。使用者輕觸時 應用程式啟動器或主畫面上的應用程式或捷徑圖示。 應用程式的工作就移到前景如果應用程式沒有任務, 就會建立新工作,而 開啟該應用程式的活動 做為堆疊的根活動
當目前的活動開始另一個活動時,新活動會推送至頂端 且會聚焦先前的活動仍會保留在堆疊中, 已停止。活動停止時,系統會保留活動目前的狀態 存取 API當使用者執行返回動作時,目前活動會是 從堆疊頂端彈出並刪除。 就會恢復先前的活動,並還原其 UI 先前的狀態。
在 堆疊不會重新排列,只會推送至堆疊出現時,才會從堆疊中彈出 由目前的活動啟動,並由使用者關閉 按下返回按鈕或手勢。因此,返回堆疊的運作方式為 最後一步物件結構圖 1 顯示 將活動推送到返回堆疊中,並從返回堆疊中彈出。

使用者持續輕觸或手勢返回時,堆疊中的每個活動 直到使用者返回首頁為止 或工作開始時正在執行的活動。全部 活動會從堆疊中移除,任務就不再存在。
根啟動器活動的返回輕觸行為
根啟動器活動是指宣告意圖
篩選並同時使用
ACTION_MAIN和
CATEGORY_LAUNCHER。
這些活動是獨一無二的,因為是進入應用程式的進入點
應用程式啟動器,並用於啟動工作。
當使用者輕觸或手勢返回根啟動器活動時,系統會 以不同的方式處理事件 裝置正在執行。
- Android 11 以下版本的系統行為
- 系統完成活動。
- Android 12 以上版本的系統行為
- 系統會將活動及其工作移至背景 結束活動。此行為符合系統預設的系統行為 使用主畫面按鈕或手勢離開應用程式。 - 在大多數情況下,這個行為代表使用者可更快繼續使用您的應用程式 暖機狀態,而不是 而不需要從冷卻系統 狀態。 - 如果需要提供自訂返回瀏覽功能, 建議您使用 AndroidX Activity API,不要覆寫 - onBackPressed()。AndroidX Activity API 會自動遵循 在沒有元件攔截系統時,應採取適當的系統行為 返回。- 不過,如果您的應用程式 處理 - onBackPressed()返回導覽並完成活動,請更新實作以呼叫 改為在- super.onBackPressed()前完成撥號中- super.onBackPressed()會在發生以下情況時,將活動及其任務移至背景 並可提供更一致的瀏覽體驗 跨應用程式
背景和前景工作

工作是連貫的單元,當使用者開始 或前往主畫面。在背景執行時 任務就會停止,但工作的返回堆疊維持不變,工作 就會失去焦點,而發生另一項工作時就會失去焦點,如圖 2 所示。A 罩杯 之後工作便可返回前景,讓使用者接續之前的進度 關閉。
以目前的工作 A 來說 其堆疊中有三個活動,包括目前活動下的兩個活動:
- 使用者使用主畫面按鈕或手勢,然後從以下應用程式啟動新的應用程式: 應用程式啟動器。 - 主畫面出現時,任務 A 會進入背景。並 應用程式啟動後,系統會使用自身的堆疊啟動該應用程式 (工作 B) 的工作 活動。 
- 使用者與應用程式互動後,再次返回主畫面並選取 先前啟動工作 A 的應用程式。 - 現在,工作 A 移到前景 - 堆疊中的所有三個活動 ,而堆疊頂端的活動會繼續恢復。此時, 使用者也可以前往主畫面並選取應用程式圖示,切換回工作 B 啟動該工作,或從 Recents 螢幕。 
多個活動例項

因為如果您的應用程式不會重新安排返回堆疊中的活動 讓使用者從多項活動開始特定活動、 建立該活動的例項並推送至堆疊上 將之前的所有活動例項都移到最上方因此, 應用程式中的活動可能會多次例項化,即便來自不同位置 如圖 3 所示
如果使用者使用返回功能 系統會依照按鈕或手勢,依序顯示活動例項 每個物件開啟時都有自己的 UI 狀態不過,您可以修改 如果不想將活動重複例項化,就應採取這個做法。學習新知 詳情請參閱管理 工作。
多視窗環境
當應用程式在多視窗模式內同時執行時 Android 7.0 (API) 支援的環境 24 級) 以上版本,系統會分別管理每個時段的工作。每項 視窗可包含多個工作執行平台的 Android 應用程式也同樣適用 Chromebook:系統會在線上管理工作或工作群組 計費方式
生命週期回顧
如何總結活動與工作的預設行為:
- 當活動 A 啟動活動 B 時,活動 A 會被停止,只是系統停止。 保留其狀態,例如捲動位置,以及在表單中輸入的任何文字。如果 在活動 B、活動 A 中,使用者輕觸或使用返回手勢 隨著狀態還原而恢復運作 
- 使用者使用主畫面按鈕或手勢離開工作時, 活動停止,且其工作會在背景執行。系統會保留 工作中每個活動的狀態。使用者之後繼續執行工作 選取啟動工作的啟動器圖示後,工作會變成 並恢復堆疊頂端的活動。 
- 如果使用者輕觸或向後做出手勢,系統就會彈出目前活動 再加以刪除系統會繼續處理堆疊中的先前的活動。時間 活動刪除後,系統不會保留該活動的狀態。 - 根啟動器活動的行為不同 當您的應用程式在搭載 Android 12 以上版本的裝置上執行時。 
- 活動可以多次例項化,即使是來自其他工作也是如此。 
管理工作
Android 會透過宣告內容 所有活動都是在同一任務中連續開始 堆疊。這項功能適用於大多數應用程式, 活動與工作之間的關係,或活動背面的方式
然而,您可能會決定中斷一般行為。 舉例來說,您可能希望應用程式中的活動在 已開始 而不是置於目前的任務內或者,在您發起 您可能會想轉送現有的實例 在返回堆疊的頂部建立新的執行個體。或者,您 您希望返回堆疊清除所有活動 (根活動除外) 使用者離開工作時。
也可以使用
<activity> 資訊清單元素
在您傳入的意圖中
startActivity()。
以下是可用來管理工作的主要 <activity> 屬性:
- taskAffinity
- launchMode
- allowTaskReparenting
- clearTaskOnLaunch
- alwaysRetainTaskState
- finishOnTaskLaunch
您可以使用下列主要意圖標記:
以下各節討論如何使用這些資訊清單屬性 和意圖旗標,定義活動與任務之間的關聯以及工作方式 並在返回堆疊中執行
也討論了工作和活動的注意事項 代表和管理。通常,您可以讓 系統會定義您的工作和活動在 「最近使用」畫面,您不需要修改這項行為。如要 資訊,請參閱「最近使用畫面」。
定義啟動模式
啟動模式可讓您定義如何與活動的新例項建立關聯 目前的任務您可以透過兩種方式定義啟動模式,詳情請參閱 下文將深入說明
- 
在資訊清單檔案中宣告活動時,您可以指定 活動開始時,活動會與工作建立關聯。 
- 
撥打電話時 startActivity()、 可以在Intent,用來宣告 新活動會與目前的任務建立關聯
因此,如果活動 A 啟動了活動 B,活動 B 可以在資訊清單中定義 以及活動 A 如何與目前任務建立關聯,而活動 A 可以使用意圖旗標。 ,要求活動 B 如何與目前工作建立關聯。
如果兩者皆是 活動會定義活動 B 如何與任務建立關聯,然後活動 A 的 如意圖中定義的要求,將會處理活動 B 的請求,如 所定義屬性
使用資訊清單檔案定義啟動模式
在資訊清單檔案中宣告活動時,您可以指定
活動會透過
<activity> 元素的
launchMode 屬性。
有五種啟動模式可以指派給 launchMode 屬性:
- "standard"
- 預設模式。系統會在工作中建立新的活動例項 並將意圖轉送到該物件活動可以是 這類執行個體會多次例項化,各執行個體可隸屬於不同的任務 一項工作可以有多個執行個體
 
- "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"也是如此
- "singleTask"
- 系統會在新任務的根層級建立活動,或尋找
具有相同相依性的現有任務活動。如果
已有活動,系統就會轉送
向現有執行個體發出意圖
onNewIntent()敬上 方法,而不必建立新執行個體。同時 現有的活動都會遭到刪除 ,瞭解如何調查及移除這項存取權。
 
- "singleInstance"。
- 行為與 "singleTask"相同,唯一差別在於系統不會啟動任何其他 將活動納入容納該例項的任務中。活動一律是 一個工作,且僅限其成員。由此工作階段發起的任何活動在以下位置開啟: 另一項任務。
 
- "singleInstancePerTask"。
- 活動只能以任務的根活動 (第一個) 形式執行
建立任務的活動,因此只能有一個執行個體
執行此活動的訓練與 singleTask啟動模式相反 可以在不同任務中啟動多個活動FLAG_ACTIVITY_MULTIPLE_TASK或FLAG_ACTIVITY_NEW_DOCUMENT。
 
另一個例子是,Android 瀏覽器應用程式宣告網路瀏覽器
指定 singleTask,即可一律在其專屬任務中開啟活動
<activity> 的啟動模式
元素。也就是說,如果您的應用程式發出意圖開啟 Android Vitals
瀏覽器的活動「並非」放在應用程式所在的工作中。
瀏覽器開始新的任務時,如果「瀏覽器」已有一項工作,
背景執行時,該工作會前進來處理新的
意圖。
無論活動是在新任務中開始,還是與
啟動應用程式的活動時,返回按鈕和手勢一律都會
返回之前的活動但是,如果您啟動的活動
會指定
singleTask 啟動模式以及該活動的例項位於
然後將整個工作移到前景到目前為止
返回堆疊則包含
堆疊的頂端圖 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> 中宣告)
元素,因為系統會使用該名稱識別預設工作
建立依附關係
興趣相似目標對像在兩種情況下會發揮作用:
- 當啟動活動的意圖含有 - FLAG_ACTIVITY_NEW_TASK敬上 旗標。- 根據預設,新活動會啟動到 打給 - startActivity()。 與呼叫端相同的返回堆疊上。- 不過,如果傳遞至 - startActivity()的意圖包含- FLAG_ACTIVITY_NEW_TASK旗標,系統會尋找其他任務來存放新活動。這通常 這是一項新工作但其實並沒有硬性規定。如果有 與新活動擁有相同相依性的現有任務,也就是活動 就會啟動到該任務中如果不是,則會開始新的工作。- 如果此旗標促使活動開始新任務,而使用者使用該標記 主畫面按鈕或手勢:使用者可透過特定方式離開應用程式 返回工作通知管理工具等部分實體 一律在外部工作中啟動活動,一律不在其本身範圍內 他們一律會將 - FLAG_ACTIVITY_NEW_TASK放入傳入的意圖- startActivity()。- 如果外部實體可能是 使用這個標記可以叫用您的活動,請注意,使用者 藉此返回 例如顯示啟動器圖示、 代表工作 - CATEGORY_LAUNCHER敬上 意圖篩選器詳情請參閱「開始工作」一節。
- 當活動具有 - 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_MAIN 和
CATEGORY_LAUNCHER
篩選。
舉例來說,如果缺少篩選器,可能會發生什麼情況:
意圖會啟動 "singleTask" 活動、啟動新的任務,以及使用者
會花費一些時間完成該項工作接著使用首頁按鈕或
手勢。工作現已傳送至背景,無法查看。現在使用者
無法返回工作,因為應用程式未顯示相關內容
啟動器。
如果您不希望使用者返回
活動,請設定 <activity>
元素的 finishOnTaskLaunch
至 "true"。詳情請參閱「清除返回堆疊」一節。
關於工作和活動的表示及管理的詳細資訊 您可以在 [最近使用] 畫面中前往 [最近] 螢幕。
