重新创建一个Activity(翻译)

重新创建一个Activity

这里有些场景,你的Activity因为普通的app行为被销毁了,比如当用点击返回按钮时或者你的Activity通过调用finish()方法通知自己被销毁了。系统也会销毁你的Activity,如果它当前被停止并且有较长时间没有被使用了,或者前台运行的Activity需要更多的系统资源导致系统必须关闭后台进程来恢复内存。

当你的Activity是因为用户点击了返回按钮或者是Activity自己结束自己的,系统对于这个Activity实例的概念是永远消失了,因为这个行为暗示这个Activity已经不再需要了。然而,如果系统销毁这个Activity实例是因为系统显示(而不是普通的app行为),则即使实际的Activity实例已经不在了,系统记得它是存在的,因此如果用户导航回这个Activity,系统使用一系列保存着的数据来创建这个Activity的新实例,这些数据描述Activity被销毁时的状态。系统用于恢复之前状态的保存着的数据被称为实例状态,是一个键值对的集合,保存在一个Bundle对象中。

警告:每次用户旋转屏幕时你的Activity会被销毁和重新创建。当屏幕改变方向时,因为屏幕配置变了,你的Activity可能需要加载替代的资源(比如布局),因此系统会销毁并重新创建前台运行的Activity。

默认的,系统使用Bundle实例状态来保存关于你的Activity布局中每个视图对象的信息(比如在文本框对象中已经输入的文本值)。因此,如果你的Activity被销毁和重新创建,布局的状态会被恢复到之前的状态,而你不需要写任何代码。然而,你的Activity可能还有更多的状态信息你希望被恢复,比如用于跟踪在这个Activity中用户进度的成员变量。

注意:为了让系统可以恢复你的Activity中各个视图的状态,每个视图必须有一个唯一的ID,通过android:id属性来提供。

为了保存关于Activity状态的额外数据,你必须重写(override)onSaveInstanceState()回调函数。当用户将要离开你的Activity时系统会调用这个方法,并传递给它保存在这个事件中的Bundle对象,这个事件是你的对象被意外销毁。如果系统在之后必须重新创建这个对象,它会传递同样的Bundle对象给onRestoreInstanceState()方法和onCreate()方法。

 保存你的Activity的状态

当你的Activity开始被停止时,系统调用onSaveInstanceState()方法,因此你的Activity可以使用一个键值对的集合保存状态信息。这个方法的默认实现保存Activity的视图层次的状态信息,比如文本框组件中的文本或者列表视图的滚动位置。

为了给你的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);
}

 警告:总是调用超类的onSaveInstanceState()实现,因此默认的实现可以保存视图层次的状态信息。

恢复你的Activity的状态

当你的Activity之前被销毁然后现在被重新创建时,你可以从系统传递给你的Activity的Bundle对象中恢复保存的数据。onCreate()和onRestoreInstanceState()方法都会收到同样的Bundle对象,包含着实例的状态信息。

因为onCreate()方法在系统创建你的Activity的新实例或重新创建之前的一个时都会调用,因此在你尝试去读它时必须检查这个Bundle对象是否是空的。如果它是空的,则系统正在创建这个Activity的一个新对象,而不是恢复之前被销毁的一个实例。

扫描二维码关注公众号,回复: 376935 查看本文章

举个例子,这是你能在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对象是否是空的。

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()实现,从而默认实现可以恢复视图层次的状态。

要学习更多的关于由于运行时重启事件(比如屏幕改变方向)重新创建你的Activity的信息,请阅读处理运行时变化。

猜你喜欢

转载自jayceyxc.iteye.com/blog/2244855