為免自己忘記,所以短短的快寫一篇,記下來。

Android 的 Runtime Change,即 App 運行時的裝置轉變,常見於螢幕旋轉、keyboard 彈出等。當這些情況出現時,Activity 會被 onDestory(),然後會以新的 "configuration" 執行 onCreate()

若無特別註明,Android 會自動處理 runtime change 。但若想自行處理的話 (如橫向螢幕時,可在 Activity 中 override onConfigurationChanged()

@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();
    }
}

除了這樣,還要在 AndroidManifest.xml 中註明你的 activity 會自行處理:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden|screenSize"
          android:label="@string/app_name">

這裡的重點是 screenSize ,在 Android 3.2 (API level 13) 以上必須包括在內,否則 onConfigurationChanged() 不會被執行。這點著實費了我一點時間才理解到 (Android doc 為什麼不將這點直接寫在 sample code 上而寫在文字中呢?)。

另外,自行處理 runtime change 代表 activities 不會被系統殺掉後再重生,而是直接執行 onConfigurationChanged() ,所以如果改變 layout 的話,都要自行處理。

最後結論為,可以的話,還是不要碰這一部份。

相關連結: