|
|
|
|
公众号矩阵

如何保存和恢复Activity状态缓存

非正常行为而破坏了Activity,那么尽管实际 Activity已经消失,但是系统还是会记住它已经存在。

作者: Android开发编程来源: Android开发编程|2021-11-16 19:37

前言

非正常行为而破坏了Activity,那么尽管实际 Activity已经消失,但是系统还是会记住它已经存在;

这样如果用户导航回到它,系统会创建一个新的的Activity使用一组保存的数据来描述Activity在被销毁时的状态;

系统用于恢复以前状态的已保存数据称为“实例状态”;

今天我们来详细介绍下;

一、如何保存临时数据

1、核心方法

  1. onSaveInstanceState() 

2、调用时机

  • 非正常行为而破坏了Activity,则会被系统调用;
  • 当您的Activity开始停止时,系统会调用,onSaveInstanceState()以便您的Activity可以使用一组键值对来保存状态信息;
  • 此方法的默认实现保存有关Activity视图层次结构状态的信息,例如EditText小部件中的文本或ListView的滚动位置;
  • 为了保存Activity的附加状态信息,您必须实现onSaveInstanceState()并向对象添加键值对Bundle;

3、使用说明

  1. static final String STATE_SCORE = "playerScore"
  2. static final String STATE_LEVEL = "playerLevel"
  3. ... 
  4. @Override 
  5. public void onSaveInstanceState(Bundle savedInstanceState) { 
  6.     // 保存用户自定义的状态 
  7.     savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
  8.     savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 
  9.     // 调用父类交给系统处理,这样系统能保存视图层次结构状态 
  10.     super.onSaveInstanceState(savedInstanceState); 

二、如何恢复临时数据

1、核心方法

  1. onRestoreInstanceState() 

2、调用时机

  • 销毁了你的Activity,则重新启动时会被系统调用;
  • 当您的Activity在之前被破坏后重新创建时,您可以从Bundle系统通过您的Activity中恢复您的保存状态;
  • 这两个方法onCreate()和onRestoreInstanceState()回调方法都会收到Bundle包含实例状态信息的相同方法;

说明:

  • 与onSaveInstanceState()区别:此处是 “确实销毁”后才调用
  • 若是 被用户主动销毁(如 用户按Back键),则不会调用
  • 肯定在调用 onStop()前被调用

3、调用场景

因为onCreate()调用该方法是否系统正在创建一个新的Activity实例或重新创建一个以前的实例,所以您必须Bundle在尝试读取之前检查该状态是否为空。如果它为空,那么系统正在创建一个Activity的新实例,而不是恢复之前被销毁的实例;

  1. @Override 
  2. protected void onCreate(Bundle savedInstanceState) { 
  3.     super.onCreate(savedInstanceState); // 记得总是调用父类 
  4.     // 检查是否正在重新创建一个以前销毁的实例 
  5.     if (savedInstanceState != null) { 
  6.         // 从已保存状态恢复成员的值 
  7.         mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
  8.         mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
  9.     } else { 
  10.         // 可能初始化一个新实例的默认值的成员 
  11.     } 
  12.     ... 

系统onRestoreInstanceState()只有在存在保存状态的情况下才会恢复,因此您不需要检查是否Bundle为空

  1. public void onRestoreInstanceState(Bundle savedInstanceState) { 
  2.     // 总是调用超类,以便它可以恢复视图层次超级 
  3.     super.onRestoreInstanceState(savedInstanceState); 
  4.     // 从已保存的实例中恢复状态成员 
  5.     mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
  6.     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 

总结

onSaveInstanceState方法是Activity的生命周期方法,主要用于在Activity销毁时保存一些信息;

【编辑推荐】

  1. 12 张图 | 硬刚了一波,三层缓存架构
  2. 阅读 Redis 源码,学习缓存淘汰算法 W-TinyLFU
  3. Gitlab CI 在 Kubernetes 中的 Docker 缓存
  4. A饭必须升级 Windows 11新补丁发布:解决锐龙L3缓存性能下降问题
  5. RabbitMQ 处理过慢,原来是一个 SQL 缓存框架导致的 GC 频繁触发
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

带你轻松入门 RabbitMQ

带你轻松入门 RabbitMQ

轻松入门RabbitMQ
共4章 | loong576

57人订阅学习

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

14人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

42人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微