一、典型情況下生命週期
Activity 生命週期大家應該非常熟悉,值得注意的是,onCreate 和 onDestroy 配對,標識 Activity 的創建與銷燬; onStart 和 onStop 配對,標識 Activity 是否可見;onResume 和 onPause 配對,標識 Activity 是否在前臺,可交互。
一個典型的生命週期:onCreate ->onStart -> onResume ->onPause -> onStop ->onDestroy
注意:
1. onPause 和 onStop 通常連續執行,除了:啓動一個新的透明主題 Activity,原 Activity 的 onStop 方法不會被回調(依然可見);
2. 從 Activity A 進入到 Activity B,回調順序是 onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A),所以不能在 onPause 方法中做重量級的操作。因爲 onPause(A) 執行完後新 Activity 才能啓動。
3. 按back鍵回退,屬於正常情況,執行 onPause -> onStop -> onDestroy,並不是下面所要講的異常情況。
二、異常情況下生命週期
所謂的異常情況,通常指的是手機配置改變(見第3條)和因內存不足導致被系統回收(見4)。
onSaveInstanceState 方法會在按Home鍵或者啓動新 Activity 以及 Activity 被異常終止時觸發調用。 Activity 被異常終止的情況下,它的調用時機是在 onStop 之前,它和 onPause 方法沒有既定的時序關係。當 Activity 被重新創建的時候,onRestoreInstanceState 會被回調,它的調用時機是 onStart 之後。非異常終止時,不調用 onRestoreInstanceState。
“系統只會在 Activity 即將被銷燬並且有機會重新顯示的情況下才會去調用 onSaveInstanceState 方法。”調用 onSaveInstanceState 與 onRestoreInstanceState 來儲存和恢復的數據,比如文本框中用戶輸入的數據、listview 滾動的位置等,這些 view 相關的狀態系統都會默認爲我們恢復。具體針對某一個 view 系統能爲我們恢復哪些數據可以查看 view 的源碼中的 onSaveInstanceState 和 onRestoreInstanceState 方法。
android:configChanges=”xxx”屬性,常用的主要有下面三個選項:
- local: 設備的本地位置發生了變化,一般指切換了系統語言;
- keyboardHidden: 鍵盤的可訪問性發生了變化,比如用戶調出了鍵盤;
orientation: 屏幕方向發生了變化,比如旋轉了手機屏幕。
配置了 android:configChanges=”xxx”屬性之後,Activity就不會在對應變化發生時重新創建,而是調用 Activity 的 onConfigurationChanged 方法。
Activity 優先級(不易被回收程度):前臺 Activity > 可見但非前臺 Activity > 後臺 Activity。