onSaveInstanceState()和onRestoreInstanceState()兩個方法,在Activity中是比較容易忽視的方法,但是不得不說還是比較好用的方法,onSaveInstanceState() 可以幫我們當一個活動不小心被殺掉后,可以幫我們回到原來的位置,通常情況下, onSaveInstanceState() 只適用於保存一些臨時的狀態。然而onRestoreInstanceState()沒有經常的使用,所以也就先不介紹了。
一:onSaveInstanceState() 什么時候調用
從這句話可以知道,當某個activity變得”容易”被系統銷毀時,該activity的onSaveInstanceState()就會被執行,除非該activity是被用戶主動銷毀的,例如當用戶按BACK鍵的時候。
二:onSaveInstanceState()方法的默認實現
如果我們沒有覆寫onSaveInstanceState()方法, 此方法的默認實現會自動保存activity中的某些狀態數據, 比如activity中各種UI控件的狀態.。android應用框架中定義的幾乎所有UI控件都恰當的實現了onSaveInstanceState()方法,因此當activity被摧毀和重建時, 這些UI控件會自動保存和恢復狀態數據. 比如EditText控件會自動保存和恢復輸入的數據,而CheckBox控件會自動保存和恢復選中狀態.開發者只需要為這些控件指定一個唯一的ID(通過設置android:id屬性即可), 剩余的事情就可以自動完成了.如果沒有為控件指定ID, 則這個控件就不會進行自動的數據保存和恢復操作。
由上所述, 如果我們需要覆寫onSaveInstanceState()方法, 一般會在第一行代碼中調用該方法的默認實現:super.onSaveInstanceState(outState)。
與此同時,當我們需要保存額外的數據時, 就需要覆寫onSaveInstanceState()方法。
三:示例
public class MainActivity extends Activity { private String message = ""; private EditText text = null; private Button button = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); text = (EditText) findViewById(R.id.editText1); button = (Button) findViewById(R.id.btnSave); if (savedInstanceState != null) message = savedInstanceState.getString("message"); button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "保存", Toast.LENGTH_SHORT).show(); } }); } @Override public void onResume(){ super.onResume(); Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); } @Override public void onSaveInstanceState(Bundle savedInstanceState){ super.onSaveInstanceState(savedInstanceState); savedInstanceState.putString("message", text.getText().toString()); } }
