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