不同事件 (有些由使用者觸發,有些由系統觸發) 可能會導致 Activity 從一個狀態轉換為另一個狀態。本文說明這類轉換的常見情況,以及如何處理這些轉換。
如要進一步瞭解活動狀態,請參閱「活動生命週期」。如要瞭解 ViewModel 類別如何協助您管理活動生命週期,請參閱「ViewModel 總覽」。
在大多數活動變更中,您不需要直接回應活動生命週期中的回呼。由於 Compose 會根據狀態重建 UI,因此您可以確保狀態儲存在適當位置 (例如 rememberSaveable 或 ViewModel),充分運用自動重組功能。
發生設定變更
有許多事件會觸發設定變更。最明顯的例子或許是直向和橫向螢幕方向之間的切換。變更語言設定或輸入裝置,也可能導致設定變更。
發生設定變更時,系統會刪除並重新建立活動。這會在原始活動執行個體中觸發下列回呼:
系統會建立新的活動例項,並觸發下列回呼:
在 Compose 中,通常不會直接與這些回呼互動。請改用 Lifecycle API 觀察狀態變化。在 Compose 中,您可以使用 LocalLifecycleOwner.current 取得目前的生命週期並新增觀察器,以便回應事件。
使用 ViewModel 執行個體、rememberSaveable 或永久本機儲存空間組合,在設定變更時保留活動的 UI 狀態。決定這些選項的結合方式取決於 UI 資料的複雜度、應用程式的用例,以及擷取速度和記憶體用量的考量因素。在大多數情況下,您應將狀態提升至 ViewModel,並使用 rememberSaveable,確保狀態在設定變更和系統啟動的程序終止期間都能保留。如要進一步瞭解如何儲存活動 UI 狀態,請參閱「儲存 UI 狀態」。
因設定變更而重新建立活動時,系統會捨棄初始組合。使用 ViewModel 或 rememberSaveable 可確保 UI 狀態在新組合中還原。
詳情請參閱「Jetpack Compose 中的生命週期」和「狀態和 Jetpack Compose」。
處理多視窗模式案例
當應用程式進入多視窗模式 (適用於 Android 7.0 (API 級別 24) 以上版本) 時,系統會通知正在執行的活動設定已變更,因此會經歷先前所述的生命週期轉換。
如果應用程式已處於多視窗模式,但大小遭到調整,也會發生這種情況。您的活動可以自行處理設定變更,也可以允許系統刪除活動,並使用新的尺寸重新建立活動。
如要進一步瞭解多視窗模式生命週期,請參閱「支援多視窗模式」中的多視窗模式生命週期說明。
在多視窗模式下,雖然使用者可以看到兩個應用程式,但只有使用者互動的應用程式會顯示在前景並具有焦點。該活動處於「已恢復」狀態,而另一個視窗中的應用程式則處於「已暫停」狀態。
當使用者從應用程式 A 切換至應用程式 B 時,系統會對應用程式 A 呼叫 onPause,並對應用程式 B 呼叫 onResume。每次使用者在應用程式之間切換時,系統都會在這兩種方法之間切換。
如要進一步瞭解多視窗模式,請參閱「支援多視窗模式」。
活動或對話方塊顯示在前景
如果前景中出現新的活動或對話方塊,取得焦點並部分遮蓋進行中的活動,遭遮蓋的活動就會失去焦點並進入「已暫停」狀態。然後,系統會對其呼叫 onPause。
當遭遮蓋的活動返回前景並重新取得焦點時,系統會呼叫 onResume。
如果前景中出現新的活動或對話方塊,取得焦點並完全遮蓋進行中的活動,遭遮蓋的活動就會失去焦點並進入「已停止」狀態。接著,系統會快速依序呼叫 onPause 和 onStop。
當同一例項的涵蓋活動返回前景時,系統會對活動呼叫 onRestart、onStart 和 onResume。如果是新執行個體進入背景,系統不會呼叫 onRestart,只會呼叫 onStart 和 onResume。
前景顯示的對話方塊不會影響重組作業。不過,與生命週期相關的副作用 (例如流程和動畫) 應使用生命週期感知 API (例如 collectAsStateWithLifecycle),視需要自動暫停及繼續作業。詳情請參閱「狀態和 Jetpack Compose」。
使用者輕觸或手勢「返回」
如果活動位於前景,且使用者輕觸或手勢返回,活動會透過 onPause、onStop 和 onDestroy 回呼進行轉場。活動會遭到刪除,並從返回堆疊中移除。
在單一活動應用程式 (例如大多數的 Compose 應用程式) 中,如果可組合函式從導覽返回堆疊中移除,rememberSaveable 就不會保留狀態。這是因為使用者輕觸「返回」時,不會預期返回同一個執行個體,因此系統會清除所有狀態。
如要實作自訂返回行為,例如顯示對話方塊,要求使用者確認是否要結束應用程式,請使用 NavigationEventHandler API。
系統終止應用程式程序
如果應用程式在背景執行,且系統需要為前景應用程式釋出記憶體,系統可能會終止背景應用程式。系統終止應用程式時,不保證會呼叫應用程式中的 onDestroy。
如要進一步瞭解系統如何決定要終止哪些程序,請參閱「活動狀態和從記憶體中清除」和「程序和應用程式生命週期」。
如要瞭解如何在系統終止應用程式程序時儲存活動 UI 狀態,請參閱「儲存及還原暫時性 UI 狀態」。