Android中Activity的生命周期探讨(3)
重新创建Activity:当Activity在屏幕被旋转时,会被destroy与recreated。此时会加载一些alternative的资源,如layout。默认情况下,系统使用Bundle实例来保存每一个视图对象中得信息。为了使Android系统能够恢复Activity中的View状态,每个View都必须有一个唯一的ID
为了确保额外更多的数据到saved instance state,在Activity的声明周期里面存在一个添加的回调函数,必须重写onSaveInstanceState(),当用户离开你的Activity时,系统会调用它。当系统调用这个函数时,系统会在你的Activity被一场Destroy时传递Bundle对象,这样,你可以增加额外的信息到Bundle中,并保存在系统中。如果系统在Activity被Destroy之后想重新创建这个Activity实例时,之前的那个Bundle对象会被传递到Activity的onRestoreInstanceState()方法和onCreate()方法中。
保存Activity状态:当Activity开始Stop时,系统会调用onSaveInstanceState(),因此你的Activity可以用键值对的集合来保存状态信息,这个方法会默认保存Activity视图的状态信息,例如在EditText组件中得文本或者是ListView的滑动位置。为了给Activity保存额外的状态信息,你必须实现onSaveInstanceState()并增加键值对到Bundle中。如:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
恢复Activity状态:当你的Activity从Destroy中重建,你可以从系统传递给你的Activity的Bundle中恢复保存的状态。onCreate()与onRestoreInstanceState()回调方法都接收到了同样的Bundle,里面包含同样的实例状态信息。因为onCreate()方法会在第一次创建新的Activity实例与重新创建之前被Destroy的实例时都被调用,你必须尝试读取Bundle对象之前检查它是否为NULL,如果为NULL,系统第一次创建新Activity。否则是恢复被Destroy的Activity。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
我们可以选择实现onRestoreInstanceState(),而不是在onCreate方法里恢复数据。onRestoreInstanceState()方法会在onStart()方法之后执行,系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需检查Bundle是否为NULL。
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}