一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留.
但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.
1 <SPAN style="FONT-SIZE: small">public class MainActivity extends Activity { 2 public static final int SECOND_ACTIVITY = 0; 3 private String temp; 4 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 // 从savedInstanceState中恢复数据, 如果没有数据需要恢复savedInstanceState为null 9 if (savedInstanceState != null) { 10 temp = savedInstanceState.getString("temp"); 11 System.out.println("onCreate: temp = " + temp); 12 } 13 } 14 15 16 // 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法 17 @Override 18 protected void onSaveInstanceState(Bundle outState) { 19 super.onSaveInstanceState(outState); 20 outState.putString("temp", temp); 21 } 22 }</SPAN>
需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比如用户按下BACK键退出activity时, 用户显然想要关闭这个activity, 此时是没有必要保存数据以供下次恢复的, 也就是onSaveInstanceState()方法不会被调用. 如果调用onSaveInstanceState()方法, 调用将发生在onPause()或onStop()方法之前.