Activity 生命週期兩三事

典型情況下的生命週期

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儘快顯示出來並切換到前臺

異常情況下的生命週期

場景:資源相關的系統配置發生改變導致Activity被殺死並重新創建(如橫豎屏切換)

onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onRestoreIntanceState





指定在某些配置改變時 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” 值。

現在,當其中一個配置發生變化時,Activity 不會重啓。相反,Activity 會調用 onConfigurationChanged()方法,並且向此方法傳遞 Configuration 對象,這個對象代表當前所有配置,你可以根據不同配置進行不同的處理:

@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()。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章