您的位置:首页 > 其它

Activity生命周期 之 重新创建一个Activity

2013-03-15 18:34 483 查看
在某些情况下,你的activity会被一些正常操作销毁,比方说返回键的按下或者是activity收到了它自身发出的销毁的指令:finish()函数的调用。还有就是如果你的activity在后台长时间处于停止状态运行,或者前台运行的activity需要更多的系统资源,这个时候系统资源不足的情况下,就回去释放一些后台运行的资源,这个2种情况下都会把后台运行的进程关闭掉,导致activity被销毁。因为back按键的按下,或者是activity自己调用finish函数结束自己,系统会认为你的这个activity的实例需要被销毁,因为这些操作表示你不在需要它。但是如果是因为系统限制的因素导致这个activity被销毁,系统就会认为activity是需要存在,不应该被销毁掉,虽然因为系统的因素被销毁了,比方说内存回收等因素,系统会记住它, 那么当用户点击返回按键返回的时候,系统会重新创建一个它的实例,并且用保存下来的数据来恢复之前它被销毁时候的状态。保存的这个数据时系统用来恢复activity之前的状态的,称之为“instance
state”,这些数据被按照键值对的方式存储在一个
Bundle 对象里面。
警告:当你旋转屏幕的时候,你的activity会被销毁并且重新创建。当屏幕改变方向的时候,因为你的屏幕的配置参数发生了变化,系统会销毁,然后重新创建前台当前运行的activity的实例,你的activity需要重新载入一个布局文件,来适应当前的屏幕。
系统默认使用bundle来保存你的activity里面的view对象的信息(比方说一个EditText里面的文本)。所以当你的activity被销毁,然后重建的时候,原来布局文件显示的状态会被恢复到之前的activity实例被销毁时候的状态,你不需要去写任何的代码来实现它。但是,还有很多数据需要你来保存的,比方说用来表示用户某个进度的变量值。
注意:为了让android系统保存你的每个view的状态,那么每个view必须有一个唯一的id,就是我们第一篇里面说的android:id属性。
为了保存除了View之外的其他的关于activity状态的数据,你必须去重写onSaveInstanceState() 函数。系统会在你离开你的activity界面的时候,调用这个函数,并且在你的activity被意外销毁的时候,系统会传给他一个Bundle对象并保存起来。如果稍后系统必须需要重新创建这个activity的实例,系统会同时传递一个相同的Bundle对象给
onRestoreInstanceState()

[code]onCreate()函数。

图示2
如图示2所示:我们的activity运行到后天,系统停止这个activity的时候,它会执行
onSaveInstanceState() 方法,你可以指定你希望保存的状态数据,防止这个activity的实例需要被重新创建。如果这个activity被意外的因为系统的因素销毁了,用户按返回按键的时候它必须被重新创建一个实例,这个时候系统会把我们之前保存的数据同时传给onRestoreInstanceState()

[code]onCreate()函数。
保存你的Activity的状态
当activity开始停止的时候,调用了onSaveInstanceState() 方法,你可以在这里把你想要保存的状态数据按照键值对的形式保存起来。下面的这个例子保存了当前视图的层次,比方说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);
}

警告:必须要调用默认的实现函数super.onSaveInstanceState(savedInstanceState); 这样才能保证系统自动去保存那些不需要我们手动去保存的View对象的状态。恢复你的Activity的状态当我们的activity的实例在销毁后被重新创建的时候,你可以利用系统传递给你的之前保存activity数据状态的Bundle对象来还原这个activity到它销毁时候的样子。
onRestoreInstanceState()

onCreate()函数都会收到保存有之前实例的状态数据的Bundle对象。
下面这个例子是在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
}
...
}

代替在onCreate里面恢复这些数据,你可以选择去实现
onRestoreInstanceState() 这个函数,这个函数在系统调养onStart函数之后调用,系统仅仅在有数据被保存在Bundle的时候才会调用 这个函数,所以在这个函数里面,你不需要去检测Bundle是否为空。
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);
}

警告:必须实现super.onRestoreInstanceState(savedInstanceState); 这个默认函数,才能保证View对象的状态被恢复。总结:1.activity被销毁有2中情况,一种是认为back按键和程序自己调用finish,另外一种是因为系统因素,activity被销毁,这个时候如果用户按返回按键,这个activity会被系统重新创建一个实例。2.在
onSaveInstanceState()
onRestoreInstanceState()
方法里面,利用Bundle来保存我们想要保存的状态数据。其中View对象的状态数据是不需要我们保存的,系统默认会自己保存和恢复,所有我们必须在重写这2个函数的时候,一定要保持默认的那个函数,不能删除,否则View对象的状态就没办法恢复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐