当点击home键或程序运行过程中突然来电话等意外情况或屏幕方向改变时,会调用onSaveInstanceState()方法进行保存数据到手机硬盘上,再次运行Activity时则调用onRestoreInstanceState()方法从硬盘中取出以保存的数据。也可从onCreate()方法中的bundle对象中取数据:
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- txt=(EditText)findViewById(R.id.txt);
- if (null!=savedInstanceState&&savedInstanceState.containsKey(CONTENT))
- {
- txt.setText(savedInstanceState.getString(CONTENT));
- }
- secondBtn=(Button)findViewById(R.id.secondBtn);
- secondBtn.setOnClickListener(listener);
- Log.i(TAG, "MainActivity-->onCreate");
- }
① onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法,如下:
- public class PreferencesActivity extends Activity {
- private String name;
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- name = savedInstanceState.getString("name"); //被重新创建后恢复缓存的数据
- super.onRestoreInstanceState(savedInstanceState);
- }
- protected void onSaveInstanceState(Bundle outState) {
- outState.putString("name", "liming");//被摧毁前缓存一些数据
- super.onSaveInstanceState(outState);
- }
- }
当Activity重新创建时,会先执行onCreate()方法,再执行onRestoreInstanceState()方法,也可以在onCreate()方法中取数据
②使用Activity默认的Shared Preference,也可以保存数据。
如果需要单击返回按钮退出程序后,下次进入仍然可以保留数据,可以在onPause()方法中设置共享参数,实际是将数据保存在系统的xml文件中
- protected void onPause(){
- super.onPause();
- //SharedPreferences uiState = getPreferences(0);
- //SharedPreferences.Editor editor = uiState.edit();
- //editor.putString(TEXT_ENTRY_KEY, myEditText.getText().toString());
- //editor.putBoolean(ADDING_ITEM_KEY, addingNew);
- //editor.commit();// Commit the preferences.
- //或:
- this.getPreferences(MODE_PRIVATE).edit().putString(TEXT_ENTRY_KEY, myEditText.getText().toString());
- }
在onResume()方法中取数据
- protected void onResume(){
- super.onResume();
- this.getPreferences(MODE_PRIVATE).edit().getString(TEXT_ENTRY_KEY,…………
- }
注意:如果系统中有两个Activity,一个处于暂停状态,一个处于停止状态,当内存不足时,系统会首先杀死停止状态的Activity
本文出自 “IT之梦” 博客,请务必保留此出处http://dreamboy.blog.51cto.com/3180937/723871