activity状态保存和恢复,高手退避

简介: activity状态保存和恢复,高手退避

概览


这本没什么可讲的,但是可能很多人并没有考虑过这个问题,而且我准备结合 ViewModel 讲一下状态的恢复和保存


状态保存


用户 activity 被系统销毁或者配置发生更改(例如旋转),此种情况当 activity 再次被重建用户的角度是希望看到他之前的状态的。因此我们可以使用 onSaveInstanceState 和 ViewModel 结合来实现状态的保存。


使用 ViewModel 进行状态保存

配置更改导致的状态保存

ViewModel 将数据保留在内存中,因此 ViewModel 的数据存储是非常快的。当配置更改 activity 被销毁 ViewModel 会保留在内存中。再次打开重建该 activity 的时候 ViewModel 可以与 activity 自动重新关联。


用户主动销毁 activity

如果是用户主动点返回键或者 finish 调用。则 ViewModel 会被清理出内存。


系统自动回收 activity

与前面两种情况不同,进程被系统回收的时候,activity 对应的 ViewModel 也会被回收。但是 activity 被重建的时候用户的角度肯定是希望 activity 状态和回收前一样的。这种情况就需要将 ViewModel 和 onSaveInstanceState 结合起来进行使用了。


持久化存储


onSaveInstanceState 只运行在主线程中并且存储的状态是被序列化到磁盘中的,所以我们只能在 onSaveInstanceState 中存储少量的基础类型或 String。

ViewModel 存在于 Activity 的生命周期内,因此只要应用进程没有被杀死,ViewModel 就可以保存状态,ViewModel 属于内存级别的状态保存。


总结一下:onSaveInstanceState 只能保存少量数据,ViewModel 只能保存数据到内存。所以对于更大的数据状态保存我们应该放在磁盘文件中或者使用数据库处理。

比如这样一个场景,我们的应用是一个 im 的即时通讯 app。在聊天列表页面,每次更新了列表中的联系人窗口数据都会使用数据库进行存储。那么就有一下三种场景了:

  1. Activity 初次创建
  2. Activity 配置发生更改导致 Activity 被重建
  3. Activity 所在进程被系统回收,再次进入被重建


针对 1:刚进入 Activity 的时候我们需要请求后台查看有没有增量的联系人,如果有拉取数据存储在本地数据库。

针对 2:的情况,Activity 被重建的时候,因为 ViewModel 没有被销毁,我们可以直接从 ViewModel 中恢复数据,不需要请求网络(当然了你为了保持数据的实时性去请求也无可厚非)

针对 3:的情况,我们可以在 onSaveInstanceState 中保存联系人的 id,Activity 被重建的时候拿到这个 id 去数据库中查找数据,这种情况也不需要请求网络。(当然了你为了保持数据的实时性去请求也无可厚非)



相关文章
Springboot项目启动的三种方式
Springboot项目启动的三种方式
897 0
|
7月前
|
人工智能 自然语言处理 开发者
HarmonyOS NEXT~鸿蒙开发利器:CodeGenie AI辅助编程工具全面解析
鸿蒙开发迎来新利器!DevEco CodeGenie 是华为推出的 AI 辅助编程工具,专为 HarmonyOS NEXT 开发者设计。它具备智能代码生成(支持 ArkTS 和 C++)、精准知识问答以及万能卡片生成三大核心功能,大幅提升编码效率。通过与 DeepSeek 深度整合,CodeGenie 实现流畅的问答体验,帮助开发者解决技术难题。无论是新手还是资深开发者,都能从中受益,享受更智能高效的开发过程。快来体验吧!
676 5
|
Android开发
【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
2331 0
【错误记录】Android Studio 中 build.gradle 配置 buildFeatures prefab 错误处理 ( AS 4.1 以上开发环境 | Gradle及插件版本 )
|
6月前
|
存储 前端开发 API
一篇文章实现Android图片拼接并保存至相册
本文详细介绍了一个Android图片拼接应用的实现过程,涵盖权限管理、图片选择、异步加载、拼接处理和保存至相册等功能。通过`ImageStitcher`类完成图片横向或纵向拼接,支持多张图片操作,并适配Android Q及以上版本的存储权限要求。代码结构清晰,包含关键步骤如权限检查、UI交互及MediaStore API使用,适合开发者快速上手并根据需求扩展功能。
209 5
|
人工智能 安全 大数据
元宇宙游戏:沉浸式体验的新纪元
在科技飞速发展的今天,元宇宙游戏作为融合了虚拟现实(VR)、增强现实(AR)、人工智能(AI)与区块链等前沿技术的数字新世界,正引领我们进入一个前所未有的沉浸式体验时代。本文将深入探讨元宇宙游戏的特点、技术基础及其如何引领沉浸式体验的新潮流。
|
Java 数据库连接 mybatis
成功解决:java.lang.Integer cannot be cast to java.lang.Long
这篇文章讨论了Java中常见的类型转换错误,包括Integer转Long、Integer转String以及在MyBatis中Map接收查询结果时的类型不匹配问题,并提供了相应的解决方法。
|
监控 Java 开发者
BeanPostProcessor:Spring框架的灵活扩展机制
【10月更文挑战第4天】在Spring框架中,BeanPostProcessor接口是一个非常重要的扩展点,它允许开发者在Spring容器实例化、依赖注入以及初始化Bean的过程中插入自定义逻辑。
213 0
|
安全 Java Android开发
Android Kotlin中如何优雅地退出循环?
本文介绍Kotlin中如何在`forEach`循环中提前退出的方法,包括使用`for`循环搭配`break`以及利用标签和`return@标签`的方式。此外,还探讨了标签与`return`、`break`和`continue`在不同场景下的应用,如嵌套循环控制、高阶函数中的提前退出及`inline`函数内的非局部返回等,帮助读者更好地掌握Kotlin的控制流技巧。
296 0
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
1680 2
|
算法 Java 索引
【Java】已解决java.lang.ArrayIndexOutOfBoundsException异常
【Java】已解决java.lang.ArrayIndexOutOfBoundsException异常
1894 0