通常來講, 調用onPause()和onStop()方法後的activity實例仍然存在於內存中, activity的全部信息和狀態數據不會消失, 當activity從新回到前臺以後, 全部的改變都會獲得保留. 可是當系統內存不足時, 調用onPause()和onStop()方法後的activity可能會被系統摧毀, 此時內存中就不會存有該activity的實例對象了. 若是以後這個activity從新回到前臺, 以前所做的改變就會消失. 爲了不此種狀況的發生, 開發者能夠覆寫onSaveInstanceState()方法. onSaveInstanceState()方法接受一個Bundle類型的參數, 開發者能夠將狀態數據存儲到這個Bundle對象中, 這樣即便activity被系統摧毀, 當用戶從新啓動這個activity而調用它的onCreate()方法時, 上述的Bundle對象會做爲實參傳遞給onCreate()方法, 開發者能夠從Bundle對象中取出保存的數據, 而後利用這些數據將activity恢復到被摧毀以前的狀態. Java代碼 收藏代碼 <span style="font-size: small;">public class MainActivity extends Activity {
public static final int SECOND_ACTIVITY = 0;
private String temp;android
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 從savedInstanceState中恢復數據, 若是沒有數據須要恢復savedInstanceState爲null if (savedInstanceState != null) { temp = savedInstanceState.getString("temp"); System.out.println("onCreate: temp = " + temp); } } public void onResume() { super.onResume(); temp = "xing"; System.out.println("onResume: temp = " + temp); // 切換屏幕方向會致使activity的摧毀和重建 if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); System.out.println("屏幕切換"); } } // 將數據保存到outState對象中, 該對象會在重建activity時傳遞給onCreate方法 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("temp", temp); }
}</span>
須要注意的是, onSaveInstanceState()方法並非必定會被調用的, 由於有些場景是不須要保存狀態數據的. 好比用戶按下BACK鍵退出activity時, 用戶顯然想要關閉這個activity, 此時是沒有必要保存數據以供下次恢復的, 也就是onSaveInstanceState()方法不會被調用. 若是調用onSaveInstanceState()方法, 調用將發生在onPause()或onStop()方法以前.數據庫
onSaveInstanceState()方法的默認實現 若是開發者沒有覆寫onSaveInstanceState()方法, 此方法的默認實現會自動保存activity中的某些狀態數據, 好比activity中各類UI控件的狀態. android應用框架中定義的幾乎全部UI控件都恰當的實現了onSaveInstanceState()方法, 所以當activity被摧毀和重建時, 這些UI控件會自動保存和恢復狀態數據. 好比EditText控件會自動保存和恢復輸入的數據, 而CheckBox控件會自動保存和恢復選中狀態. 開發者只須要爲這些控件指定一個惟一的ID(經過設置android:id屬性便可), 剩餘的事情就能夠自動完成了. 若是沒有爲控件指定ID, 則這個控件就不會進行自動的數據保存和恢復操做. 由上所述, 若是開發者須要覆寫onSaveInstanceState()方法, 通常會在第一行代碼中調用該方法的默認實現: super.onSaveInstanceState(outState).框架
是否須要覆寫onSaveInstanceState()方法 既然該方法的默認實現能夠自動的保存UI控件的狀態數據, 那何時須要覆寫該方法呢? 若是須要保存額外的數據時, 就須要覆寫onSaveInstanceState()方法. 如須要保存類中成員變量的值(見上例).ide
onSaveInstanceState()方法適合保存什麼數據 因爲onSaveInstanceState()方法方法不必定會被調用, 所以不適合在該方法中保存持久化數據, 例如向數據庫中插入記錄等. 保存持久化數據的操做應該放在onPause()中. onSaveInstanceState()方法只適合保存瞬態數據, 好比UI控件的狀態, 成員變量的值等.spa
引起activity摧毀和重建的其餘情形 除了系統處於內存不足的緣由會摧毀activity以外, 某些系統設置的改變也會致使activity的摧毀和重建. 例如改變屏幕方向(見上例), 改變設備語言設定, 鍵盤彈出等.code