安卓训练-开始-管理 Activity 生命周期-重新创建 Activity

来源:互联网 发布:安卓 ndk软件 编辑:程序博客网 时间:2024/04/30 09:09

重新创建 Activity

上一课
下一课
这节课教你
  1. 保存你的 Activity 的状态
  2. 恢复你的 Activity 的状态
你还需要阅读
  • 支持不同的屏幕
  • 处理运行时变化
  • Activities

有一些正常的应用行为,比如用户按了后退按钮或者你的 activity 调用 finish() 销毁它自己。当你的 activity 已经停止并且已经很长时间没被使用了,或者前台 activity 需要更多资源系统必须关闭后台线程以重新获得内存时,系统也可能销毁你的 activity。

当你的 activity 由于用户按了后退或者 activity 结束了它自己而被销毁,系统认为 Activity 实例永远消失了,因为这些行为表示不再需要这个 activity 了。但是,如果系统销毁这个 activity 是因为系统限制(而不是正常的应用行为),那么尽管实际的Activity 实例消失了,系统会记住它是存在的,因此如果用户导航回到它,系统会使用当它销毁时保存的描绘它的 的状态的数据创建一个新的实例。系统用于恢复先前状态的保存的数据称为 "实例状态(instance state)",它是用一个Bundle 对象存储的键值对集合。

警告:每次用户旋转屏幕时,你的 activity 会被销毁和重建。当屏幕改变方向,系统销毁并重建前台 activity,因为屏幕配置已经变了并且你的 activity 可能需要加载其他的资源(比如布局)。

默认情况下,系统使用 Bundle 实例状态保存你的 activity 布局中的每个View 对象的信息(比如一个EditText 对象中输入的文本值)。因此,如果你的 activity 实例销毁并重建,不需要你写任何代码,布局会恢复到先前的状态。但是,你的 activity 可能有更多状态信息想要恢复,比如 activity 跟踪用户进度的成员变量。

注意:为了让系统恢复你的 activity 的视图的状态,每个视图必须有一个唯一 ID,由 android:id 属性提供。

为了保存关于 activity 状态的另外的数据,你必须覆盖 onSaveInstanceState() 回调方法。当用户离开你的 activity 时系统调用这个方法,并把Bundle 对象传给它,Bundle 会在你的 activity 意外销毁事件中被保存。如果系统在后面必须重建 activity 实例,它把相同的Bundle 对象传给onRestoreInstanceState()onCreate() 方法。

图 2. 当系统开始停止你的 activity 时,调用onSaveInstanceState() (1),你可以指定你想保存的额外的状态数据以防Activity 被重建。如果 activity 被销毁并且相同的实例必须被重建,系统把 (1) 中定义的状态数据传给onCreate() 方法 (2) 和onRestoreInstanceState() 方法 (3)。

保存你的 Activity 的状态


当你的 activity 开始停止时,系统调用 onSaveInstanceState(),你的 activity 能使用一个键值对集合保存状态信息。这个方法的默认实现保存这个 activity 的视图层次结构的状态信息,比如一个EditText 控件中的文本或者一个ListView 的滚动位置。

为了保存你的 activity 的额外的状态信息,你必须实现 onSaveInstanceState() 并且添加键值对到Bundle 对象。例如:

static final String STATE_SCORE = "playerScore";static final String STATE_LEVEL = "playerLevel";...@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {    // 保存用户当前游戏状态    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);        // 总是调用超类,它能保存视图层次结构状态    super.onSaveInstanceState(savedInstanceState);}

警告: 总是调用超类的 onSaveInstanceState() 的实现,这个默认实现能保存视图层次结构状态。

恢复你的 Activity 的状态


当你的 activity 在被销毁后又被重建,你可从系统传给你的 activity 的那个 Bundle 恢复你保存的状态。onCreate()onRestoreInstanceState() 回调方法都接收那个包含实例状态信息的Bundle

系统不管是创建你的 activity 的一个新的实例还是重建一个先前的实例,都会调用 onCreate() 方法,在试图从Bundle 中读取数据前,你都必须检查它是否为 null。如果为 null,那系统正创建 activity 的新的实例,如果不为 null,那系统在恢复一个先前被销毁的实例。

例如,这里是你怎样在 onCreate() 中恢复一些状态数据:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState); // 总是先调用超类       // 检查我们是否在重建一个先前销毁的实例    if (savedInstanceState != null) {        // 从保存的状态中恢复成员变量的值        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);    } else {        // 可能使用默认值初始化新实例的成员变量    }    ...}

作为在 onCreate() 中恢复状态的替代方案,你可以选择在实现onRestoreInstanceState(),系统会在onStart() 方法之后调用这个方法。系统只有在有保存的状态需要恢复时,才调用onRestoreInstanceState(),所以你不需要检查Bundle 是否为 null:

public void onRestoreInstanceState(Bundle savedInstanceState) {    // 总是调用超类,它能恢复视图层次结构    super.onRestoreInstanceState(savedInstanceState);       // 从保存的实例中恢复成员变量状态    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);}

警告:总是调用超类的 onRestoreInstanceState() 的实现,这个默认实现可以恢复视图层次结构状态。

学习更多关于由运行时重启事件(比如当屏幕旋转)引起的 activity 的重建,阅读 处理运行时变化。

上一课下一课
 
 
0 0
原创粉丝点击