首页 > 代码库 > Recreating an Activity
Recreating an Activity
有几个场景中你的activity会销毁是由于正常的app行为,例如当用户按下后退按钮或通过调用finish()方法销毁自身。系统也会销毁你的activity如果是目前停止并长时间没有被使用或前台activity需要更多的资源,所以系统必须关闭后台进程去回收内存。
当你的activity是因为用户按下返回键而被摧毁时,activity实例在系统中是被永久销毁了,因为该行为表示activity不再是被需要的了。然而,如果系统销毁activity时由于系统约束(而不是正常程序行为),虽然实际的activity实例被销毁,但系统记得它存在,如果用户返回它,系统创建一个新的activity实例使用一组销毁时被保存的数据,系统使用以前的数据恢复以前的状态称为“实例状态”,是一组键值对存储在Bundle对象里。
注意:当用户旋转屏幕时,你的activity将会被销毁,当屏幕改变方向时,系统会破坏并重新创建前台的activity,因为在屏幕的配置已经改变,你的activity可能需要加载替代资源(如布局)。
默认情况下,系统使用Bundle实例去保存你activity布局文件里每个View对象的信息(如文本值进入EditText对象)。所以,如果你的活动实例被销毁并重新创建,布局状态会被自动修复到原来的样子。然而,你的activity可能有更多你想恢复的状态信息,如成员变量跟踪用户的活动的进展。
注:为了使Android系统恢复在您的活动的意见的状态,每个视图必须具有唯一的ID,通过android:id属性声明。
为了节省额外活动状态的数据,您必须覆盖onSaveInstanceState()回调方法,系统调用该方法是在用户离开你的activity并通过它的Bundle对象保存意料之外被销毁的事件。如果系统之后必须重新创建活动实例,它将同一个Bundle对象传递给onRestoreInstanceState()和onCreate()方法。
图解:随着系统开始停止你的activity,它调用onSaveInstanceState()(1),您可以指定额外的状态数据并把它们保存起来,以防活动实例必须被重新创建。如果activity被摧毁,必须重新创建相同的实例,该系统通过调用onCreate()方法(1),(2)和onRestoreInstanceState()方法(3)并传入之前保存的对象来实现。
保存你Activity的状态
当你的activity 开始要停止时,系统调用onSaveInstanceState()方法并把一个状态信息放在一个键值对中。 此方法的默认实现保存信息活动的状态的视图层次,如一个EditText小部件中的文本或滚动列表视图的位置。
为你保存你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状态
你可以选择实现onRestoreInstanceState()方法代替onCreate()方法去恢复状态。系统会在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);
}
注意:始终调用父类的onRestoreInstanceState()方法,这样的默认实现可以恢复视图层次的状态。
Recreating an Activity