不同的事件 (有些使用者觸發和系統觸發) 可能會導致 Activity
從某個狀態轉換到其他狀態。本文將說明發生這類轉換的一些常見情況,以及如何處理這些轉換。
如要進一步瞭解活動狀態,請參閱活動生命週期。如要瞭解 ViewModel
類別如何協助您管理活動生命週期,請參閱「ViewModel 總覽」。
設定變更
有許多事件可能會觸發設定變更。最明顯的例子或許是變更直向和橫向螢幕方向之間的變化。其他可能導致設定變更的情況包括語言設定或輸入裝置變更。
發生設定變更時,系統會刪除活動,然後重新建立活動。這會在原始活動例項中觸發下列回呼:
建立新的活動執行個體,並觸發下列回呼:
搭配使用 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 狀態」。