Android Training - 重建一个Activity
来源:互联网 发布:雷欧奥特曼mac队 编辑:程序博客网 时间:2024/06/05 19:04
存在一些情况,由于普通的程序行为,你的activity会被销毁,比如,当用户点击Back按钮,或者自己调用finish()方法。另外,如果activity被停止了并且很久没被使用,或者前台的系统需要更多的资源,系统也可能会销毁你的activity。
当你的activity开始停止,系统就调用onSaveInstanceState(),你可以在这个函数中使用key-value对的集合保存信息。默认函数实现了保存activity的view状态,比如EditText的文本,或者ListView的滚动条位置。
警告:通常需要在onSaveInstanceState()实现中调用它的父类方法,以便能够实现保存view的信息。
如果你的activity在它被销毁后重启,你可以从系统传递给你的Bundle中恢复保存的状态,onCreate()和onRestoreInstanceState()都可以接受到相同的包含实例状态信息的Bundle。
你也可以选择在onRestoreInstranceState()方法中实现,当系统调用完onStart()函数后会调用onRestoreInstranceState(),不过仅仅是当有状态需要恢复时才会调用,所以你不需要检查Bundle是否为空:
警告:通常需要调用onRestoreInstanceState()的父类方法,以便能恢复默认的视图状态。
当你的activity是因为按Back键或者自己结束的,那么系统认为这个activity实例已经是不需要了,因为你的行为明确指出了你要销毁它。然而,如果系统是强制销毁你的activity的话,虽然activity实例已经没有了,不过系统能够记住它的存在,当用户从新回到这个程序时,系统会使用activity被销毁时保存的状态重新创建一个activity实例。这个系统用来恢复先前状态的保存数据被称为“实例状态”,是一些key-value的集合保存在Bundle对象中。
警告:当用户旋转屏幕时,你的activity会被销毁并且重新创建。因为屏幕配置已经改变,你的activity可能也需要加载另外一些可选择的资源(比如布局)。
默认情况下,系统使用Bundle实例状态保存布局中每个View对象的信息(比如EditText对象中的文本值)。所以,如果你的activity对象被销毁和重新创建时,布局状态会重新恢复到先前的状态。不管怎样,你的activity可能有很多需要恢复的状态信息,比如追踪用户进程的成员变量。
为了你能够保存一些额外的数据到实例状态中,这里提供了一个额外的生命周期回调函数,它没有在前面课程的图例中显示出来。这个函数叫onSaveInstanceState(),当用户离开activity时系统会调用它。当你的activity被意外销毁时,系统会调用这个函数,函数的Bundle对象会被保存下来,所以你可以添加额外的信息给这个Bundle。然后,如果系统必须重启这个被销毁的activity,它就传递相同的Bundle对象给activity的onRestoreInstanceState()方法和onCreate()方法。
图解:当系统开始停止你的activity,它呼叫onSaveInstanceState()(1)方法,因此你可以保存指定的附加状态数据。如果activity被销毁了,然后相同的实例要被重新创建,系统传递定义在(1)的状态给onCreate()(2)和onRestoreInsatanceState()(3)。
保存你的activity状态
当你的activity开始停止,系统就调用onSaveInstanceState(),你可以在这个函数中使用key-value对的集合保存信息。默认函数实现了保存activity的view状态,比如EditText的文本,或者ListView的滚动条位置。
为了保存附加信息,你必须实现onSaveInstanceState()方法,添加key-value对到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); // 通常调用父类,让他能保存View的信息。 super.onSaveInstanceState(savedInstanceState);}
警告:通常需要在onSaveInstanceState()实现中调用它的父类方法,以便能够实现保存view的信息。
恢复你的activity状态
如果你的activity在它被销毁后重启,你可以从系统传递给你的Bundle中恢复保存的状态,onCreate()和onRestoreInstanceState()都可以接受到相同的包含实例状态信息的Bundle。
因为onCreate()函数在系统创建一个新的activity实例或者重新创建前一个activity时都会调用,所以你必须在读取Bundle前检查它是否为空,如果是空的,那么系统是创建一个新的实例,如果不是,那么就恢复前一个被销毁的activity。
例如,这里是onCreate()方法中实现恢复数据:
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Always call the superclass first // 检查是否是一个前面销毁的activity实例。 if (savedInstanceState != null) { // 恢复玩家状态 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else { // 为新实例初始化一个默认值 } ...}
你也可以选择在onRestoreInstranceState()方法中实现,当系统调用完onStart()函数后会调用onRestoreInstranceState(),不过仅仅是当有状态需要恢复时才会调用,所以你不需要检查Bundle是否为空:
public void onRestoreInstanceState(Bundle savedInstanceState) { // 调用父类恢复默认的View的状态 super.onRestoreInstanceState(savedInstanceState); // 恢复玩家状态 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);}
警告:通常需要调用onRestoreInstanceState()的父类方法,以便能恢复默认的视图状态。
学习更多在运行中重建activity(比如屏幕旋转)的知识,可以看这里:Handling Runtime Changes.
- Android Training - 重建一个Activity
- Training--重建一个Activity
- Android Training - 开始一个Activity
- Android Training - 暂停和恢复一个Activity
- 【Android Training - 01】详解Activity生命周期 [ Lesson 4 - 重建销毁的Activity ]
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建
- Training--启动一个Activity
- Android培训---重建Activity
- Android基础---重建Activity
- Android开发第2-4课:重建一个Activity
- Android Training - 停止和重启一个Activity
- Android 屏幕旋转 Activity 重建
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity
- Android Training - 启动另一个Activity
- Android Training - 管理Activity生命周期
- Training--暂停和继续(运行)一个Activity
- Training--停止和重启一个Activity
- Android横竖屏切换小结(重建、非重建Activity)
- Exchange Server 2010 DAG激活数据库副本设置
- Oracle SQL优化
- linux 通过uid获取用户名
- 如何在Drupal当中获取node id?
- ASP.NET内置对象
- Android Training - 重建一个Activity
- 软件靠吃年轻饭、学习技巧、就业或上研等问题之我见
- 改造联想本本 Novo 键
- 链表的一个小程序
- xls读取数字的科学技术法转化
- 在Exchange Server 2010中如何监视高可用性和站点恢复
- I2C设备驱动编写,struct i2c_device_id,struct i2c_driver,i2c_add_driver,i2c_register_board_info
- JSP静态包含和动态包含问题
- ICMP协议