概念:
保存Activity的状态是非常重要的,例如我们在玩一个游戏的时候,突然来了一个电话,这个时候在接听完电话之后我们返回到游戏中,这个时候我们希望游戏还是之前那个进度,或者说发生突发事件,游戏这个应用程序被关闭了,这个时候我们如果再重新打开游戏的话,我们如果还是希望回到之前的进度,我们就需要将其状态保存起来,这样在Activity的摧毁时,我们还能够根据保存的状态回到之前的进度。这就是Activity的状态保存。
生命图:
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留.
但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.
需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前,所以我们在onSaveInstanceState() 方法中只能用来保存我们的Activity的临时的状态信息,而对于要持久化保存的对象或状态,我们应该在 onPause() 方法中来做。
界面:
代码:
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity { private static final String TAG = "logmain"; private Button button; private EditText name; private CheckBox soccer; private CheckBox basketball; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); name = (EditText) this.findViewById(R.id.editText); soccer = (CheckBox) this.findViewById(R.id.cbsoccer); basketball = (CheckBox) this.findViewById(R.id.cbbasketball); button = (Button) this.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this, NextActivity.class); startActivity(i); } }); //通过onCreate取值 if (savedInstanceState != null) { String s = savedInstanceState.getString("name"); boolean cbsoccer = savedInstanceState.getBoolean("soccer"); boolean cbbasketball = savedInstanceState.getBoolean("basketball"); //测试1 /* name.setText("oncreatename"); soccer.setChecked(true); basketball.setChecked(false);*/ //赋值1 name.setText(s); soccer.setChecked(cbsoccer); basketball.setChecked(cbbasketball); } Log.i(TAG, "---Main onCreate---"); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "---Main onStart---"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { //调用activity的onRestoreInstanceState得到保存的值 //如果赋值1注释了 测试1开放 再把 super.onRestoreInstanceState(savedInstanceState)和通过onRestoreInstanceState取值注释 //旋转屏幕就是测试1的值 super.onRestoreInstanceState(savedInstanceState); //通过onRestoreInstanceState取值 /*if (savedInstanceState != null) { String s = savedInstanceState.getString("name"); boolean cbsoccer = savedInstanceState.getBoolean("soccer"); boolean cbbasketball = savedInstanceState.getBoolean("basketball"); //测试2 //name.setText("onrestorename"); //soccer.setChecked(false); //basketball.setChecked(true); //赋值2 name.setText(s); soccer.setChecked(cbsoccer); basketball.setChecked(cbbasketball); }*/ Log.i(TAG, "---Main onRestoreInstanceState---"); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "---Main onResume---"); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "---Main onPause---"); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //通过onSaveInstanceState存值 outState.putString("name", name.getText().toString().trim()); outState.putBoolean("soccer", soccer.isChecked()); outState.putBoolean("basketball", basketball.isChecked()); Log.i(TAG, "---Main onSaveInstanceState---"); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "---Main onStop---"); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "---Main onRestart---"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "---Main onDestroy---"); }}
布局:
测试:注意顺序
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onPause---
06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onSaveInstanceState---(存值)06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onStop---06-04 10:41:19.454 28735-28735/com.liang.activitydemo I/logmain: ---Main onDestroy---06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onCreate---(取值方法1)06-04 10:41:19.542 28735-28735/com.liang.activitydemo I/logmain: ---Main onStart---06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onRestoreInstanceState---(取值方法2)06-04 10:41:19.546 28735-28735/com.liang.activitydemo I/logmain: ---Main onResume---