典型情況下的生命週期
Activity生命週期基本切換過程,如圖
需要說明的是:
1、當用戶再次回到原 Activity 時,回調如下:onRestart -> onStart -> onResume
2、從Activity A 啓動 Activity B,如果 B 是透明主題,A 的 onStop 不會回調
場景:假設當前Activity爲A,如果這時用戶打開一個新Activity B,那麼B的onResume和A的onPause哪個先執行呢?
執行順序如下:
A: onPause -> B: onCreate -> B: onStart -> B: onResume -> A: onStop
onPause和onStop都不能執行耗時操作,尤其是onPause,這也意味着,我們應當儘量在onStop中做操作,從而使得新Activity儘快顯示出來並切換到前臺
異常情況下的生命週期
我們可以在 AndroidManifest.xml 中配置 android:configChanges 來指定該 Activity 在哪些系統配置改變時不重新建立。
配置項很多,常用的是這四個:
android:configChanges="screenSize|orientation|keyboardHidden|locale"
screenSize|orientation 指的是在屏幕旋轉和尺寸改變時不重新創建keyboardHidden 指的是可用鍵盤的改變
locale 指的是系統語言切換
從 Android 3.2(API 級別 13)開始,當設備在縱向和橫向之間切換時,“屏幕尺寸”也會發生變化。
因此,在開發針對 API 級別 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 屬性中所聲明)的應用時,若要避免由於設備方向改變而導致運行時重啓,則除了 “orientation” 值以外,您還必須添加 “screenSize” 值。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
如果在配置改變時仍使用舊的狀態,則可以不實現 onConfigurationChanged()。