Activity在非正常行为下的数据保存和恢复

onSaveInstanceState

今天同举在移植CPActivity到印尼钱包的时候遇到了一个数据保存的问题,这里简单了解了一下。

比如我们要做一个游戏软件,如果 Activity 当前被停止长期未使用(比如用户离开了),或者游戏被压到后台了,前台Activity需要更多资源以致系统必须关闭后台进程恢复内存,Activity也可能被系统销毁。在这种「非正常应用行为」结束的情况下,已经被销毁的Activity实例在用户重新打开Activity的时候会被恢复。

有一个回调方法叫作 onSaveInstanceState(),Activity开始停止时系统会调用它。如果你使用这个回调方法然后什么都不做的话,那么系统会在Bundle里为你保存Activity布局。比如你已经在EditText里输入了文字了,Activity恢复的时候这些文字也会恢复。如果你想保存其他东西,也可以往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);
}
复制代码

然后在恢复的时候,可以选择两种方式:

  1. onCreate()
  2. onRestoreInstanceState()

使用onCreate()的话,需要判断savedInstanceState是否为空,比如对于上面的游戏的例子,恢复用户的得分和等级:

@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}//...
}
复制代码

更具体的,在JDRActivity里,我们看到如果传进来的bundle为空,就初始化uidata,否则就获取保存在bundle中的uidata:

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (savedInstanceState == null) {mUIData = initUIData();} else {savedInstanceState.setClassLoader(getClass().getClassLoader());mUIData = (UIData) savedInstanceState.getSerializable(UIDATA);postRestoreUIData(savedInstanceState);}//更多操作...
//...}复制代码

也可以使用 onRestoreInstanceState()这个回调方法,这个方法在onStart之后,onCreate之前。这种情况下不需要判断savedInstanceState是否为空,因为只有不为空的时候系统才会调用这个。

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);
}
复制代码

persistAcrossReboots

有一个有趣的新特性,可以实现关机后数据保存。在API 21之后,如果在Manifest中加入:

android:persistableMode="persistAcrossReboots"
复制代码

现在,下面三个方法中中,都添加了这样的一个新的Bundle:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
复制代码

这个Bundle用来保存关机后的数据(我猜的,没有验证过)。

Reference:
[1]https://developer.android.com/training/basics/activity-lifecycle/recreating.html
[2]https://developer.android.com/guide/components/activities.html
[3]http://blog.csdn.net/lincyang/article/details/45287599

转载于:https://juejin.im/post/5a313306f265da431523e96d

EP21 Activity在非正常行为下的数据保存和恢复相关推荐

  1. Android中Fragment数据保存和恢复

    原文地址:请扫文后stormzhang大神的微信公众号--AndroidDeveloper 写在前面 上周我们总结了Activity中数据的保存和恢复,我们花两分钟来回顾一下: Android中突发情 ...

  2. 模拟Android内存不足 activity回收 值保存 状态恢复

    作者简介 微信公众号(高质量文章推送):陈博易 作者:陈博易 声明:本文是个人原创,未经允许请勿转载 商业合作请在微信公众号回复:联系方式 **## 前言 1.我记得我实习的那会,面试官问我关于aci ...

  3. Unity EasySave3中文图文教程详解-万能数据保存插件多平台支持

    Chinar blog :www.chinar.xin Unity插件 - EasySave中文详解 本文提供全流程,中文翻译. Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无 ...

  4. 重温3 Activity Intent 向下传递数据 向上传递数据

    1.使用Intent向下传递数据 Intent intent = new Intent(MainActivity.this,SecongActivity.class); intent.putExtra ...

  5. Activity之间使用intent传递大量数据带来问题总结

    转载:大飞 http://blog.csdn.net/rflyee/article/details/47441405 Activity之间使用Parcel传递大量数据产生的问题. Activity之间 ...

  6. android数据回传多个页面_Android Day06四大组件之Activity多页面跳转和数据传递

    ToolBar中menu无法同时显示图标和文字问题的解决方法 Toolbar添加返回按钮 ToolBar与ActionBar 1.什么是Activity 官方文档是这么说的:Anwhich users ...

  7. Android读取assets目录下文件数据内容

    Android读取assets目录下文件数据内容 Android的体系架构设计中,assets目录下的数据内容(图片.文件等等)将不会被Android系统压缩.二次处理等,assets目录下的文件 ...

  8. android activity之间跳转和数据传递参数,Activity跳转(有返回数据跳转)以及传递参数和回传参数...

    使用Bundle在Activity之间传递数据 Bundle类是一个key-value对,是一个final类 两个Activity之间通信可以用Bundle类实现步骤: 新建一个Bundle类 Bun ...

  9. Android零基础入门第76节:Activity数据保存和横竖屏切换

    在前面几期学习了Activity的创建.配置.启动和停止,还学了Activity的生命周期,本期一起来学习Activity有关的更多事儿. 一.数据保存 通过上一期 LogCat 窗口打印的日志可以看 ...

最新文章

  1. mysql分区失败_MYSQL表分区操作错误1503解决方案
  2. boost::proto::flatten相关的测试程序
  3. why we need createBindingContext in SAP UI5
  4. 调用另一个cpp的变量_再谈条件变量—从入门到出家
  5. 熵的基础知识,特征工程,特征归一化,交叉验证,grid search,模型存储与加载
  6. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2 1 4
  7. php7 viewmodel,ViewModel浅析
  8. java面试关于ssh的_[Java教程]ssh面试题
  9. vue 查看变量类型_前端开发问题集:Vue开发中数据更新了,为何视图没有发生变化呢...
  10. java 操作linux_java程序里调用linux命令
  11. postman传数组参数
  12. qt实现简易时钟(Qpaintevent),可以当作桌面摆件
  13. android 百度 tts,百度语音TTS. android 启动时闪退
  14. 解决《Python源码剖析》扫描版PDF字体模糊问题
  15. 交叉编译器的安裝以及使用 (Linaro 交叉编译器 基于Ubuntu16)
  16. Mac 用久了空间不足?教你如何清理磁盘空间
  17. pycharm设置字体样式_pycharm设置主题/默认格式/字体
  18. 教师职业道德与专业发展
  19. 验证身份证号码是否有效
  20. 微信小程序开发——实现修改文章富文本(hf_editor)输入框回显文章功能

热门文章

  1. 常用的清除浮动的方法
  2. ASUS华硕飞行堡垒fx80gd怎么用Fn+F5功能控制风扇转速
  3. opencv在电脑屏幕上画_用Python+OpenCV让电脑帮你玩微信跳一跳
  4. 3转自 饮水思源 bbs.sjtu.edu.cn·[FROM: 202.120.25.97]
  5. 接口传输带格式的文字和图片_2020最漂亮早上好表情图带字带祝福文字,清晨最暖心的祝福语图片...
  6. 程序员有前途吗?出路在哪里?
  7. 从删库到跑路or恢复,记一次MySQL数据库文件损坏恢复经历
  8. VDD,DVDD,AVDD,VCC,AFVDD,DOVDD,IOVDD
  9. Stata 画图配色
  10. Android大型实战:《亲信,优雅的从入门到进阶》-刘桂林-专题视频课程