活動狀態變更

不同的事件 (有些使用者觸發和系統觸發) 可能會導致 Activity 從某個狀態轉換到其他狀態。本文將說明發生這類轉換的一些常見情況,以及如何處理這些轉換。

如要進一步瞭解活動狀態,請參閱活動生命週期。如要瞭解 ViewModel 類別如何協助您管理活動生命週期,請參閱「ViewModel 總覽」。

設定變更

有許多事件可能會觸發設定變更。最明顯的例子或許是變更直向和橫向螢幕方向之間的變化。其他可能導致設定變更的情況包括語言設定或輸入裝置變更。

發生設定變更時,系統會刪除活動,然後重新建立活動。這會在原始活動例項中觸發下列回呼:

  1. onPause()
  2. onStop()
  3. onDestroy()

建立新的活動執行個體,並觸發下列回呼:

  1. onCreate()
  2. onStart()
  3. onResume()

搭配使用 ViewModel 執行個體、onSaveInstanceState() 方法或永久本機儲存空間,在設定變更期間保留活動的 UI 狀態。決定這些選項的組合方式取決於 UI 資料的複雜度、應用程式的用途,以及擷取速度與記憶體用量的考量因素。如要進一步瞭解如何儲存活動 UI 狀態,請參閱「儲存 UI 狀態」。

處理多視窗模式的情況

當應用程式進入多視窗模式 (Android 7.0 (API 級別 24) 以上版本) 時,系統會通知設定變更的執行中活動,進而完成前述的生命週期轉換。

如果已在多視窗模式下的應用程式調整大小,也會發生此行為。活動可以自行處理設定變更,或是允許系統刪除活動,並使用新的維度重新建立活動。

如要進一步瞭解多視窗生命週期,請參閱「多視窗模式支援」頁面中的多視窗生命週期說明。

在多視窗模式下,雖然使用者能看到兩個應用程式,但只有使用者互動的那一人位於前景。該活動處於「已恢復」狀態,而其他視窗中的應用程式處於「已暫停」狀態。

當使用者從應用程式 A 切換至應用程式 B 時,系統會在應用程式 A 上呼叫 onPause(),並在應用程式 B 上呼叫 onResume()。每次使用者切換應用程式時,系統都會在這兩種方法之間切換。

如要進一步瞭解多視窗模式,請參閱「多視窗模式支援」。

在前景中顯示活動或對話方塊

如果前景出現新的活動或對話方塊,且聚焦及部分涵蓋進行中的活動,所涵蓋的活動就會失去焦點,並進入「已暫停」狀態。然後,系統會對其呼叫 onPause()

當涵蓋的活動返回前景並重新取得焦點時,系統會呼叫 onResume()

如果前景出現新活動或對話方塊,且聚焦並完全涵蓋進行中的活動,所涵蓋的活動就會失去焦點,並進入「已停止」狀態。然後,系統會快速連續地呼叫 onPause()onStop()

當涵蓋活動的相同執行個體返回前景時,系統會在活動上呼叫 onRestart()onStart()onResume()。如果是背景活動的新例項,則系統不會呼叫 onRestart(),只會呼叫 onStart()onResume()

使用者輕觸或返回手勢

如果活動在前景執行,且使用者輕觸或手勢返回,則活動會透過 onPause()onStop()onDestroy() 回呼轉換。系統會刪除該活動,並從返回堆疊中移除。

根據預設,onSaveInstanceState() 回呼不會觸發。這個行為假設使用者在輕觸「返回」後,並未預期返回相同的活動例項。

不過,您可以覆寫 onBackPressed() 方法以實作自訂行為,例如顯示對話方塊,要求使用者確認他們退出應用程式。

如果覆寫 onBackPressed() 方法,強烈建議您仍從覆寫的方法叫用 super.onBackPressed()。否則,系統返回行為可能會對使用者造成困擾。

系統終止應用程式處理程序

如果應用程式在背景運作,且系統需要釋出前景應用程式的記憶體,可以終止背景應用程式。當系統終止應用程式時,無法保證應用程式會呼叫 onDestroy()

如要進一步瞭解系統如何決定要刪除哪些程序,請參閱「活動狀態以及從記憶體中排除」和「程序和應用程式生命週期」。

如果想瞭解如何在系統終止應用程式程序時儲存活動 UI 狀態,請參閱「儲存及還原暫時性 UI 狀態」。