原文地址:http://android.xsoftlab.net/training/basics/activity-lifecycle/recreating.html#RestoreState

有这么几个关于activity通过正常渠道销毁的场景,比如用户按下了返回按钮,又或者是在activity中调用了终止信号finish。系统可能也会在activity在停止状态时销毁它,也可能会在长时间不使用的时候销毁它,也可能会当前台activity需要更多资源时,系统必须关掉后台进行来恢复内存时销毁它。

当activity因为用户按下了返回按钮或者是自己关闭而被销毁的话,系统会认为activity的实例是永远消失了,因为习惯上会认为activity已经不再需要了。然而,如果activity是因为系统资源枯竭而被销毁的话,尽管activity的实例已经被销毁了,系统会记得它存在过,以便用户在返回的时候系统可以创建一个新的activity实例,并且通过上一个activity销毁时保存的一系列数据来恢复当时的状态。系统恢复原先的状态时通过一个名为instance state的对象存储的数据,它是一个Bundle对象,并以键值对的方式存储数据的集合。

警告:在每次用户旋转屏幕的时候,activity会被销毁并重新创建。当屏幕改变的方向,系统会销毁并重新创建当前的activity,因为屏幕的配置发生了改变,activity可能需要加载更改后的资源(比如说布局)。

默认情况下,系统使用Bundle对象存储activity不居中每一个View对象的信息(比如说在EditText中输入的内容)。所以如果activity对象被销毁然后重新创建了的话,可以不必再写多少代码就可以恢复布局的状态到原来的状态。然而,activity可能有更多的状态信息需要恢复,比如activity中记录用户进度的成员变量。

Note:为了使Android系统可以保存activity中view的状态,每一个VIEW必须拥有唯一的ID,支持android:id属性。

为了保存activity状态的附加数据,你必须重写onSaveInstanceState方法。系统会在用户离开的时候调用这个方法,并且会传回一个Bundle对象,这个对象可以用来在activity意外被销毁的事件中保存下来。如果系统稍后必须创建activity实例,系统会通过onRestoreInstanceState方法和onCreate方法传递相同的Bundle对象。

随着系统开始停止activity,它会调用onSaveInstanceState(1),所以你可以指定一些在稍后恢复的时候所需要的附加状态数据。如果activity销毁了,然后一个相同的实例必须重新创建,那么系统会通过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 statesavedInstanceState.putInt(STATE_SCORE, mCurrentScore);savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);// Always call the superclass so it can save the view hierarchy statesuper.onSaveInstanceState(savedInstanceState);
}

警告:因为总是调用了onSaveInstanceState的父类实现,所以默认实现可以保存view层级的状态。

恢复Activity的状态

如果之前的activity销毁了之后又重新创建了,可以通过Bundle对象恢复保存的状态。onCreate方法和onSaveInstanceState方法都会将相同的Bundle对象通过参数回调回来。

因为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 instanceif (savedInstanceState != null) {// Restore value of members from saved statemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);} else {// Probably initialize members with default values for a new instance}...
}

除了onCreate方法可以恢复状态之外,onRestoreInstanceState()方法同样也可以实现该功能,该方法会在onStart方法之后调用,不过仅仅是在保存了数据之后才会调用,所以你不需要去做Bundle对象是否为null的检查:

public void onRestoreInstanceState(Bundle savedInstanceState) {// Always call the superclass so it can restore the view hierarchysuper.onRestoreInstanceState(savedInstanceState);// Restore state members from saved instancemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

警告:因为总是调用了onRestoreInstanceState()的父类实现,所以默认实现可以恢复view层级的状态。

有关更多因为在运行时的重启事件而造成的activity重新创建(比如屏幕旋转)的信息,请参见Handling Runtime Changes。

Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建相关推荐

  1. Android官方开发文档Training系列课程中文版:通知用户之创建不同导航方式的Activity

    原文地址:http://android.xsoftlab.net/training/notify-user/navigation.html 设计通知时要考虑到用户所预想的导航体验.通常有以下两种情况: ...

  2. Android官方开发文档Training系列课程中文版:目录

    原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻 ...

  3. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建

    原文地址:http://android.xsoftlab.net/training/custom-views/index.html 引言 Android框架含有大量的View类,这些类用来显示各式各样 ...

  4. Android官方开发文档Training系列课程中文版:OpenGL绘图之图形绘制

    原文地址:http://android.xsoftlab.net/training/graphics/opengl/draw.html 如果你还不清楚如何定义图形及坐标系统,请移步:Android官方 ...

  5. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之Fragment创建

    原文地址:http://android.xsoftlab.net/training/basics/fragments/index.html 导言 为了在Android中创建动态的多面板用户界面,你需要 ...

  6. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之入门指南

    入门指南 欢迎来到安卓开发训练课,在这里你可以找到一系列课程来描述如何使用现有的代码示例来重新适用到你的APP上,你可以在左侧的导航栏顶部看到在若干个大项里有若干个有组织的子项课程.(导航栏请参见官方 ...

  7. Android官方开发文档Training系列课程中文版:动画视图之应用场景

    原文链接:http://android.xsoftlab.net/training/transitions/transitions.html 在转场框架中,动画是由一帧帧的图像连续绘制形成的,这一帧帧 ...

  8. Android官方开发文档Training系列课程中文版:动画视图之转场框架介绍

    原文地址:http://android.xsoftlab.net/training/transitions/index.html 引言 Activity所呈现的UI经常会由用户的输入或者其它事件而发生 ...

  9. Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放

    原文地址:http://android.xsoftlab.net/training/managing-audio/index.html 引言 如果APP需要播放音频,允许用户可以控制音频的播放状态是很 ...

  10. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity

    原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/index.html 导言 用户通过导航退出或者返回应用的时 ...

最新文章

  1. java 风袖,仓库 - 高谷深陵 (gaogushenling) - Gitee.com
  2. Python以表格、可视化图像的形式输出模型特征重要度(feature importances)并进行重要度归一化及排序
  3. ArrayList和LinkedList的各项操作性能比较
  4. python3入门到精通pdf-总算知道python3入门到精通
  5. sql 取表的前10条记录,任意中间几行的记录
  6. ORACLE MTTR
  7. 微信小程序 长按图片不出现菜单_微信小程序实现长按删除图片的示例
  8. Ubuntu 18.04 下如何配置mysql 及 配置远程连接
  9. 分布式技术一周技术动态 2016.07.10
  10. ns3 统计一个包所经历的时延_【直击UDE2020】显示链接的智慧生活,你我正在经历...
  11. 产品经理如何培养气场
  12. 详解Spring框架的AOP机制
  13. UI设计师应该知道的汉字体种类的用途(免费素材)
  14. Angel深度学习在广告推荐训练优化中的实践.pdf(附下载链接)​
  15. 团队合作-需求分析之WBS
  16. 负载均衡和故障转移的使用案例
  17. ArcGIS打开shapefile失败:形状数与记录表数不一致
  18. 系统架构师论文-论企业应用集成(-集成ERP/PDM/E-mail)
  19. 阿里云活动价格点击购买时价格上涨的解决办法
  20. 在线Java/C++/C语言/Python/web网页编辑器(IDE)整理

热门文章

  1. 常用哈希函数的比较及其实现
  2. C++ 多重继承之内存存储
  3. V4L2用户空间和kernel层driver的交互过程
  4. STM32F7xx —— 输入
  5. cx_Oracle安装出现的问题
  6. my eclipse 类似dreamweaver编辑html,8款替代Dreamweaver的开源网页开发工具
  7. python中sys模块有什么用_Python中模块之sys的功能介绍
  8. LeetCode 1578. 避免重复字母的最小删除成本
  9. LeetCode 1199. 建造街区的最短时间(优先队列贪心)
  10. 程序员面试金典 - 面试题 16.11. 跳水板(数学)