编辑: bingyan8 2018-11-21
重新创建 Activity 课程内容 1.

保存 Activity 状态 2. 恢复 Activity 状态 扩展阅读 ? Supporting Different Screens ? Handling Runtime Changes ? Activities 在一些场景中,activity 因为一些普通的 app 行为而被销毁,如用户按下后退按钮或 activity 通过调用 finish()方法自己发出销毁信号.另外,如果当前 activity 已结束且长时间没有 被使用或者因前台 activity 需要更多资源系统关闭后台进程以恢复内存,这些情况也可能会 导致系统销毁该 activity. 如果activity是因为用户按下后退按钮或者自行结束导致被销毁, 在系统的概念中, 该activity 的实例就永远消失了(这些操作/行为意味着 activity 已经不再被需要).但如果是因系统限 制(而非普通的 app 行为)导致 activity 被销毁,那么即使 activity 实例已经消失,系统也 会记住它的存在状态,在用户返回时系统使用预先保存的描述该 activity 销毁时状态的数据 创建该 activity 的一个新实例.系统保存的用于恢复先前状态的数据被称为"实例状态", 该数据是保存在 Bundle 对象中的键值对集合. 警告: 每次用户旋转屏幕时,activity 都会被销毁并重新创建.当屏幕改变方向时,因为屏幕 配置改变,activity 可能需要加载不同的资源(如layout),系统就会销毁并重新创建前台 activity. 默认情况下,系统使用 Bundle 实例状态保存 activity 布局中每个 View 对象的信息(如输 入到 EditText 对象的文本值),所以如果 activity 实例被销毁并重新创建,layout 布局可 以恢复到之前的状态而无需手动写任何代码. 当然 activity 可能有更多的状态信息需要恢复, 如activity 中跟踪用户进度的成员变量. 注意: 为了 Android 系统能够恢复 activity 中view 对象的状态,每个 view 对象必须有一个 唯一的 ID,通过 android:id 属性提供. 为了保存额外的 activity 状态数据,必须重写 onSaveInstanceState()方法,当用户开始 离开 activity 时系统调用该方法, 并把将要在 activity 意外销毁事件中保存的 Bundle 对象传 给该方法.如果后面系统必须重新创建该 activity 实例,它会将相同的 Bundle 实例同时传 给onRestoreInstanceState()和onCreate()方法. 图2. 当系统准备结束 activity, 它调用 onSaveInstanceState()(1)此时可指定需要保存的额 外的状态数据(以防 Activity 实例被销毁而需重新创建).如果该 activity 被销毁,必须重新 创建相同的实例,系统将传递在(1)中定义的状态数据给 onCreate()方法(2)和onRestoreInstanceState()方法(3) 保存 Activity 状态 当activity 开始结束,系统调用 onSaveInstanceState()方法,此时 activity 可使用键值 对集合保存状态信息,该方法的默认代码保存了 activity 的view 层次信息,如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);

} 警告: 必须调用父类的 onSaveInstanceState(),默认的方法实现可保存 view 系统状态 恢复 Activity 状态 当activity 在注销并被重新创建时, 可以从系统传递给 activity 的Bundle 对象中恢复保存的 状态.onCreate()和onRestoreInstanceState()方法都接收同一个包含实例状态信息 的Bundle 对象. 因无论在系统新建一个 activity 的实例或者重新创建一个以前的实例时都会调用 onCreate()方法, 所以在读取之前必须检查 Bundle 对象是否为空,若为空则创建 activity 新实例否则就恢复先前销毁的实例. 举例如何在 onCreate()方法中恢复数据: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题
大家都在看的话题