需要注意的是, onSaveInstanceState()方法並不是一定會被調用的, 因為有些場景是不需要保存狀態數據的. 比如用戶按下BACK鍵退出activity時, 用戶顯然想要關閉這個activity, 此時是沒有必要保存數據以供下次恢復的, 也就是onSaveInstanceState()方法不會被調用. 如果調用onSaveInstanceState()方法, 調用將發生在onPause()或onStop()方法之前.
1 public class MainActivity extends Activity { 2 public static final int SECOND_ACTIVITY = 0; 3 private String temp; 4 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 // 從savedInstanceState中恢復數據, 如果沒有數據需要恢復savedInstanceState為null 9 if (savedInstanceState != null) { 10 temp = savedInstanceState.getString("temp"); 11 System.out.println("onCreate: temp = " + temp); 12 } 13 } 14 15 public void onResume() { 16 super.onResume(); 17 temp = "xing"; 18 System.out.println("onResume: temp = " + temp); 19 // 切換屏幕方向會導致activity的摧毀和重建 20 if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { 21 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 22 System.out.println("屏幕切換"); 23 } 24 } 25 26 // 將數據保存到outState對象中, 該對象會在重建activity時傳遞給onCreate方法 27 @Override 28 protected void onSaveInstanceState(Bundle outState) { 29 super.onSaveInstanceState(outState); 30 outState.putString("temp", temp); 31 } 32 }
onSaveInstanceState()方法的默認實現
如果開發者沒有覆寫onSaveInstanceState()方法, 此方法的默認實現會自動保存activity中的某些狀態數據, 比如activity中各種UI控件的狀態. android應用框架中定義的幾乎所有UI控件都恰當的實現了onSaveInstanceState()方法, 因此當activity被摧毀和重建時, 這些UI控件會自動保存和恢復狀態數據. 比如EditText控件會自動保存和恢復輸入的數據, 而CheckBox控件會自動保存和恢復選中狀態. 開發者只需要為這些控件指定一個唯一的ID(通過設置android:id屬性即可), 剩余的事情就可以自動完成了. 如果沒有為控件指定ID, 則這個控件就不會進行自動的數據保存和恢復操作.
由上所述, 如果開發者需要覆寫onSaveInstanceState()方法, 一般會在第一行代碼中調用該方法的默認實現: super.onSaveInstanceState(outState).
是否需要覆寫onSaveInstanceState()方法
既然該方法的默認實現可以自動的保存UI控件的狀態數據, 那什么時候需要覆寫該方法呢?
如果需要保存額外的數據時, 就需要覆寫onSaveInstanceState()方法. 如需要保存類中成員變量的值(見上例).
onSaveInstanceState()方法適合保存什么數據
由於onSaveInstanceState()方法方法不一定會被調用, 因此不適合在該方法中保存持久化數據, 例如向數據庫中插入記錄等. 保存持久化數據的操作應該放在onPause()中. onSaveInstanceState()方法只適合保存瞬態數據, 比如UI控件的狀態, 成員變量的值等.