有几个场景中你的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状态
当你的activity是先前被销毁现在又重建的时候,你可以从Bundle对象中恢复你保存的状态。onCreate()和onRestoreInstanceState()回调方法得到相同的Bundle实例。
因为onCreate()方法被系统调用有两种情况,一种是创建一个新的activity实例,还有一种是恢复之前activity的实例,所以你必须在阅读之前检查Bundle对象是否为null,如果为null,系统是正在创建一个新的activity实例,否则就是重建一个之前被销毁的activity。
例如,你可以在onCreate()方法中恢复一些状态数据:
@Override
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()方法去恢复状态。系统会在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()方法,这样的默认实现可以恢复视图层次的状态。