android被杀以后fragments缓存重建问题和测试方法
这个问题,其实不是太好复现。因为在android的缓存Fragment机制是写在androidx的库中。
主要的原因是android Framework机制:
framework
at yourpackage.onSaveInstanceState(XXXActivity.kt:118)
at android.app.Activity.performSaveInstanceState(Activity.java:2283)
at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1508)
at android.app.ActivityThread.callActivityOnSaveInstanceState(ActivityThread.java:5878)
at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5281)
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5247)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5312)
at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:43)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:17
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259)
主要流程:
ActivityThread->onPause|onStop|performDestroyActivity|callActivityOnStop|handleRelaunchActivity
Instrumentation-> callActivityOnSaveInstanceState
activity->onSaveInstanceState
即,当activity发生了需要停止和隐藏的时候,或者Relaunch等等情况,根据具体的尝尽是否进行保存。因为大部分情况是不会触发的。
只要后台不做app保活的情况,手机内存回收的情况等才会触发。
app
然后onSaveInstanceState就到app代码+androidx库代码了,不同的androidx版本或者之前的android.support版本是不同的:
override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)//val e = Exception()//e.printStackTrace()}
这个是你自己的activity。然后调用super。即追溯到
androidx:activity库 ComponentActivity,
androidx:savestate库 SavedStateRegistryController | SavedStateRegistry.performSave,
outBundle.putBundle(SAVED_COMPONENTS_KEY, components) //“androidx.lifecycle.BundlableSavedStateRegistry.key”
接着,就是FragmentAcitvity的FragmentManager,对于SavedStateRegistry的注册。将
//SAVED_STATE_TAG = "android:support:fragments";registry.registerSavedStateProvider(SAVED_STATE_TAG, () -> {return saveAllStateInternal();//里面进行缓存Fragment});
总结就是framework提供了暂存的触发条件,app的库内部支持了缓存机制。
模拟方案和调试手段
其实更重要的是:你平时无法复现,而测试或者用户出现了。
这里提供几个思路:
- 开发者选项,不保留活动打开。这样每次按home回到launcher,再次进,是会触发onSaveInstanceState的;
- 把程序按home放到后台去。如果你有蓝牙权限,可以尝试在应用管理里面,把蓝牙权限关闭,三星手机android13必定触发,因为关闭蓝牙权限,他会立刻结束对应的app。再次切回来,就会重建;
- 在需要调试的Fragment代码中,在构造函数里面,或者kotlin的init{}函数,添加
可以十分方便的看到framework-androidx的代码逻辑。val e = Exception()e.printStackTrace()
修改方案如下:
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {super.onSaveInstanceState(outState, outPersistentState)removeCachedFragments(outState)}override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)removeCachedFragments(outState)}private fun removeCachedFragments(outState: Bundle) {if (false) { //非androidx 自行根据情况开启。outState.putParcelable("android:support:fragments", null)outState.putParcelable("android:fragments", null)} else { //androidxoutState.getBundle("androidx.lifecycle.BundlableSavedStateRegistry.key")?.let {it.remove("android:support:fragments")it.remove("android:fragments")}}}
其他:
三星手机还有一个问题,当关闭应用管理-蓝牙权限,app会立刻死掉进程。然后拉起的是你最后的activity。
如果你有一些初始化逻辑放在SplashActivity或者前置的一些地方,则会导致初始化不正常。
所以需要考虑将一些逻辑放到application的初始化中去。
相关文章:
android被杀以后fragments缓存重建问题和测试方法
这个问题,其实不是太好复现。因为在android的缓存Fragment机制是写在androidx的库中。 主要的原因是android Framework机制: framework at yourpackage.onSaveInstanceState(XXXActivity.kt:118) at android.app.Activity.performSaveInstanceState(A…...
Visual Studio 2017 安装
C自学精简实践教程 目录(必读) 这篇文章会保证你第一次安装VS2017就成功运行Hello World! 下载Visual Studio Installer Gitee 下载 VS2017/vs2017_Community.exe CalmReason/VisualStudio - 码云 - 开源中国 (gitee.com) 百度云下载 链接:https://pan.baidu…...
day5|242.有效的字母异位词、349. 两个数组的交集
242.有效的字母异位词 题目链接:https://leetcode.cn/problems/valid-anagram/ 文章链接:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html 视频链接:https://www.bilibili.…...
【Python基础】常用模块学习:sys|os|pytest
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
【煤矿虚拟仿真体验】VR采煤机技能培训有效提高训练效果
在我们的社会中,能源是至关重要的。它是推动我们日常生活和工作的主要动力。然而,我们在获取这种能源的过程中,也带来了许多环境问题。煤矿开采是其中的一个重要部分,因此我们需要寻找更环保、更安全的方式来进行煤矿开采。VR&…...
渲染路径RenderingPath
文章目录 前言一、什么是渲染路径二、渲染路径有哪些1、前向渲染路径2、延迟渲染路径3、顶点照明渲染路径(已过时)4、旧的渲染路径(已过时) 前言 渲染路径RenderingPath 一、什么是渲染路径 为进行光照计算而设计的渲染方式 二、渲染路径有哪些 1、前向…...
【Java】泛型 之 extends通配符
我们前面已经讲到了泛型的继承关系:Pair<Integer>不是Pair<Number>的子类。 假设我们定义了Pair<T>: public class Pair<T> { ... }然后,我们又针对Pair<Number>类型写了一个静态方法,它接收的参…...
光谱-空间特征分割提取:多光谱图像压缩
Spectral–Spatial Feature Partitioned Extraction Based on CNN for Multispectral Image Compression (基于CNN的光谱-空间特征分割提取多光谱图像压缩) 近年来,多光谱成像技术的迅速发展引起了各领域的高度重视,这就不可避免…...
绝缘子主要尺寸
声明 本文是学习GB-T 1000-2016 高压线路针式瓷绝缘子尺寸与特性. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高压线路针式瓷绝缘子的结构型式、尺寸、机械特性和电气特性。 本标准适用于标称电压为10 kV 及以下、频率不高于…...
什么是哈希表?如何使用哈希表进行数据存储和查找?
什么是哈希表? 哈希表(Hash Table),也被称为散列表,是一种用于存储键值对数据的数据结构。它是一种非常高效的数据结构,可以实现快速的数据插入、查找和删除操作。哈希表的核心思想是通过将键(…...
脑机接口的发展研究
1.调研对象:智能制造人机交互; 2.作业内容,关于个人所选技术的近期发展(2020-2023年)期间的相关技术问题和研究进展; 3.内容结构,分为摘要介绍(100字以内),近…...
短期光伏发电量短期预测(Python代码,先对异常值处理,再基于XGBoost模型预测)
一.代码流程(运行效果:短期光伏发电量短期预测(Python代码,先对异常值处理,再基于XGBoost模型预测)_哔哩哔哩_bilibili 模型流程: 导入所需的库,包括NumPy、Pandas、Matplotlib、Sea…...
SpringCloud Gateway--Predicate/断言(详细介绍)中
😀前言 本篇博文是关于SpringCloud Gateway–Predicate/断言(详细介绍)中,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以…...
Linux内核启动流程-第一阶段汇编流程简介
一. Linux启动流程 看完 Linux 内核的顶层 Makefile 以后再来看 Linux 内核的大致启动流程, Linux 内核的启 动流程要比 uboot 复杂的多,涉及到的内容也更多。 本文中,我们就大致的了解一下 Linux 内 核的启动流程。 要分析 Li…...
SpringBoot-Druid
目录 1.什么是Druid 2.主要优点和原因 3.误区 4.Part代码 0.pom 1.Spring.datasource.type: com.alibaba.druid.pool.DruidDataSource 2.Druid用Jasypt加密任意内容 EnableEncryptableProperties开启加密注解 3.Druid监控平台 1.什么是Druid Druid 是一个开源的数据库…...
PAT甲级真题1006:签到与签出
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
【架构篇】Supabase架构和功能介绍
Supabase是什么 Supabase将自己定位为Firebase的开源替代品,提供了一套工具来帮助开发者构建web或移动应用程序。Supabase是建立在Postgres之上的,Postgres是一个免费的开源数据库,被认为是世界上最稳定、最先进的数据库之一。Supabase对标F…...
Github主页无法打开和Assets转圈
1、cmd启动命令行 2、github.com打不开,多刷新几遍。等成功打开时,命令行输入nslookup github.com,把非权威应答下的IP地址复制到C:\Windows\System32\drivers\etc\hosts里,如查到的IP是192.30.255.112,则填写 192.30.255.112 gi…...
rm误删文件恢复
rm误删文件恢复 问题描述安装extundeleteyum安装extundelete编译安装extundelete 常用参数动作(action): 尝试数据恢复前置条件卸载磁盘分区查看被删除数据信息 恢复文件恢复指定inode号文件恢复指定文件名恢复指定目录恢复所有可恢复文件恢复指定时间的文件恢复指定…...
爬虫 — 多线程
目录 一、多任务概念二、实现多任务方式1、多进程 (Multiprocessing)2、多线程(Multithreading)3、协程(Coroutine) 三、多线程执行顺序四、多线程的方法1、join()2、setDaemon()3、threading.enumerate() …...
2026专业护眼产品深度评测:告别眼干涩疲劳,哪款才是“医用级“长效养护的选择?
屏幕时代,眼睛正在为我们的工作和生活"买单"。从早起看手机的那一刻,到深夜关灯前最后一次刷屏,多数人每天面对电子屏幕的时间早已超过10小时。干涩、疲劳、视力模糊、异物感……这些曾经只出现在中老年人身上的困扰,正…...
1688图搜接口有复购率对于选品的你们有帮助吗
1688 图搜接口的复购率数据,对选品非常有帮助,是判断商品长期生命力与供应链稳定性的核心指标。一、复购率在图搜选品中的核心价值验证商品质量与用户粘性高复购率(B 端通常 > 20%,优秀 > 30%)直接证明商品质量稳…...
手把手教你配置Figma MCP:打造属于你自己的AI驱动设计组件库(以阅读题为例)
智能设计革命:用Figma MCP构建AI驱动的交互式学习组件库 当设计系统遇上生成式AI,一场关于效率与智能化的变革正在悄然发生。在Figma中构建可动态响应数据的智能组件库,已成为中高级UI/UX设计师突破传统设计边界的必备技能。本文将深入解析如…...
如何用代码快速绘制专业图表?Mermaid Live Editor彻底改变你的可视化工作流
如何用代码快速绘制专业图表?Mermaid Live Editor彻底改变你的可视化工作流 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me…...
本日我的《宅男神探》为当当电子书【玄幻/惊悚】榜第六名
本日我的《宅男神探》为当当电子书【玄幻/惊悚】榜第六名! 地址http://e.dangdang.com/products/1901322470.html 杨赞是一名热爱推理的年轻人,平时喜欢用逻辑思维分析生活中的各类 问题。大学毕业后,他在母校附近开了一家小书店࿰…...
SoundSwitch音频配置文件深度解析:应用触发和多设备管理的完整指南
SoundSwitch音频配置文件深度解析:应用触发和多设备管理的完整指南 【免费下载链接】SoundSwitch C# application to switch default playing device. Download: https://soundswitch.aaflalo.me/ 项目地址: https://gitcode.com/gh_mirrors/so/SoundSwitch …...
ISO/SAE 21434:2021 逐条审核判定表
A 章节号|B 条款|C 要求内容|D 符合性|E 证据 / 说明|F:不符合整改项符合性选项:符合 / 部分符合 / 不符合 / 不适用章节号条款审核要求内容符合性证据 / 备注整改项44.1建立网络安全生命周…...
串口通信与Modbus协议:工业自动化中的黄金搭档
1. 工业自动化的通信基石:串口与Modbus为何成为黄金组合 在工厂车间的控制柜里,PLC正以每秒数十次的频率采集着温度传感器的数据;在自动化生产线上,机械臂的每个动作都精准同步着传送带的节奏。这些看似神奇的工业魔法,…...
Llama-3.2V-11B-cot开源大模型案例:科研论文插图数据真实性初筛
Llama-3.2V-11B-cot开源大模型案例:科研论文插图数据真实性初筛 1. 项目背景与价值 科研论文插图的真实性核查是学术出版领域的重要环节。传统人工检查方式存在效率低、主观性强等问题。Llama-3.2V-11B-cot多模态大模型为解决这一问题提供了创新方案。 这款基于M…...
二极管单向导电性的秘密:为什么你的电路不工作?可能是二极管接反了!
二极管单向导电性的秘密:为什么你的电路不工作?可能是二极管接反了! 刚接触电子电路的朋友们,一定遇到过这样的困惑:明明按照电路图连接了所有元件,电源也接通了,可电路就是不工作。这时候&…...
