重新创建Activity
2016-06-01 17:56
260 查看
重新创建Activity
本课程将向您展示如何
保存Activity状态恢复Activity状态
您还应阅读
支持不同屏幕处理运行时更改
Activity
在有些情况下,您的Activity会因正常应用行为而销毁,比如当用户按 返回按钮或您的Activity通过调用
finish()示意自己的销毁。
如果Activity当前被停止或长期未使用,或者前台Activity需要更多资源以致系统必须关闭后台进程恢复内存,系统也可能会销毁Activity。
当您的Activity因用户按了返回 或Activity自行完成而被销毁时,系统的
Activity实例概念将永久消失,因为行为指示不再需要Activity。
但是,如果系统因系统局限性(而非正常应用行为)而销毁Activity,尽管
Activity实际实例已不在,系统会记住其存在,这样,如果用户导航回实例,系统会使用描述Activity被销毁时状态的一组已保存数据创建Activity的新实例。
系统用于恢复先前状态的已保存数据被称为“实例状态”,并且是
Bundle对象中存储的键值对集合。
注意:每次用户旋转屏幕时,您的Activity将被销毁并重新创建。 当屏幕方向变化时,系统会销毁并重新创建前台Activity,因为屏幕配置已更改并且您的Activity可能需要加载备用资源(比如布局)。
默认情况下,系统会使用
Bundle实例状态保存您的Activity布局(比如,输入到
EditText对象中的文本值)中有关每个
View对象的信息。
这样,如果您的Activity实例被销毁并重新创建,布局状态便恢复为其先前的状态,且您无需代码。 但是,您的Activity可能具有您要恢复的更多状态信息,比如跟踪用户在Activity中进度的成员变量。
注意:为了 Android 系统恢复Activity中视图的状态,每个视图必须具有
android:id属性提供的唯一
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视图层次的状态信息,例如
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()的超类实现,以便默认实现可以保存视图层次的状态。
恢复Activity状态
当您的Activity在先前销毁之后重新创建时,您可以从系统向Activity传递的Bundle恢复已保存的状态。
onCreate()和
onRestoreInstanceState()回调方法均接收包含实例状态信息的相同
Bundle。
因为无论系统正在创建Activity的新实例还是重新创建先前的实例,都会调用
onCreate()方法,因此您必须在尝试读取它之前检查状态
Bundle是否为
null。 如果为 null,则系统将创建Activity的新实例,而不是恢复已销毁的先前实例。
例如,此处显示您如何可以在
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 } ... }
您可以选择实现系统在
onStart()方法之后调用的
onRestoreInstanceState(),而不是在
onCreate()期间恢复状态。
系统只在存在要恢复的已保存状态时调用
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); }
注意:始终调用
onSaveInstanceState()的超类实现,以便默认实现可以恢复视图层次的状态。
要了解更多有关因运行时重启事件(例如屏幕旋转时)而重新创建Activity的信息,请阅读处理运行时更改。
原本地址
相关文章推荐
- appium 环境搭建
- 表单重置reset
- C/C++中static关键字详解
- 微信支付教程(一)
- Maven项目部署到Tomcat7服务器
- git rev-parse 命令
- 高德地图地址经纬度转化 URL
- Linux上查看造成IO高负载的进程
- 再理解RankNet算法
- 自定义键盘
- java操作excell工具类
- iOS开发中的手势总结
- JS实现一个简单的抽奖系统
- 怎么才能线程安全?
- 常用docker命令,及一些坑
- OI刷题记录
- 第二阶段团队项目冲刺第九天
- Node学习笔记(二):事件驱动
- 通过html中的元素来调用javascript中的脚本
- lua 中 loadstring 应用(用于游戏中解析字符串公式)