龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 移动开发 > Android开发 >

Android中Activity的生命周期探讨(3)

时间:2014-10-23 02:28来源:网络整理 作者:网络 点击:
分享到:
重新创建Activity:当Activity在屏幕被旋转时,会被destroy与recreated。此时会加载一些alternative的资源,如layout。默认情况下,系统使用Bundle实例来保存每一个

重新创建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);
}

精彩图集

赞助商链接