onConfigurationChanged与 Save-Restore InstanceState机制与RetainNonConfiguration机制

android横竖屏切换的生命周期

没设置configChanges,销毁后重建:

onCreate--onStart--onResume--onPause--onStop--onSaveInstanceState--onDestroy--onCreate--onStart--onRestoreInstanceState--onResume--onPause--onStop--onDestroy

设置configChanges:

横竖屏切换走onConfigurationChanged方法,不会重新走生命周期

android:configChanges="keyboardHidden|screenSize|orientation"

源码:

//config变化,分发到应用上,先去ensure topActivity确定该走Activity
//的relaunch还是onConfigurationChanged,再去ensure其他Activities
mAtmService.ensureConfigAndVisibilityAfterUpdate(starting, changes);

开始relaunch:
ActivityThread.handleRelaunchActivityInner(args..){
    if (!r.paused) {
        performPauseActivity(r, false, reason, null /* pendingActions */);
    }
    if (!r.stopped) {
        callActivityOnStop(r, true /* saveState */, reason);
    }
    handleDestroyActivity(r, false, configChanges, true, reason);
    ...
    handleLaunchActivity(r, pendingActions, customIntent);
}

Framework层Config Change流程_configchange流程-CSDN博客

Framework层Config Change流程_configchange流程-CSDN博客

当由系统发起而非人为手动关闭Activity的时候,Activity有可能在未来的某个时机恢复重建。Android系统提供了两套机制,用以保存和恢复界面状态。 这两套机制我个人分别给其取名为 Save-Restore InstanceState机制RetainNonConfiguration机制

1)Save-Restore InstanceState机制的初衷是保存界面的一些瞬时状态,常保存一些比较轻量级的数据,因为保存过程需要经历数据的序列化和反序列化。onSaveInstanceState(outState)的被调用的条件:非手动杀死Activity而是系统kill同时可能会在未来重建时。

2)RetainNonConfigurationInstance机制:当如横竖屏的切换、语言切换等配置发生改变时也会触发Activity的重建。这种由配置发生改变而导致的Activity重建除了会触发Save-Restore InstanceState机制之外也会触发RetainNonConfigurationInstance机制。用于保存配置发生前的数据,这个数据理论上是没有结构和大小限制的甚至可以把旧Activity本身保存其中。

如果两个方法同时出现时,onSaveInstanceState()方法执行在先,而onRetainNonConfigurationInstance()方法执行在后。它们的执行顺序都在onStop()和onDestroy()之间

viewmodel

  • 重写了onRetainNonConfigurationInstance()方法并把方法设置为了final。onRetainNonConfigurationInstance()方法内部创建NonConfigurationInstances对象nci,把viewModelStore存放到nci,同时收集onRetainCustomNonConfigurationInstance()方法的返回值存在nci里
  • viewmodel中横竖屏转换,横竖屏切换等配置发生变化导致的重建时,新Activity中可听过ensureViewModelStore()方法获取从旧Activity传递过来viewmodelstore,这样就实现了横竖屏切换的时候viewmodel不丢失。
  • 另外值得注意的点是,Activity onDestory的时候,会通过isChangingConfigurations()方法判断activity是否处于配置变化状态,如果不是就会将viewmodelstores清空掉。

ActivityThread.java
    销毁时存
    void handleDestroyActivity(args..){
        ...
        r.lastNonConfigurationInstances = r.activity.retainNonConfigurationInstances();
        ...
    }

    
    //handleLaunchActivity()--performLaunchActivity(),重新创建时取
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ...
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.activityConfigCallback,
                        r.assistToken, r.shareableActivityToken);
        ...
        return activity;
    }



ensureViewModelStore():恢复viewmodel数据

activity destory时且不是因为配置项改变导致,clear viewmodel

总结

1.设置configChanges,会触发onConfigurationChanged方法,不会重新走生命周期,也就不会走数据回复机制(Save-Restore InstanceState机制RetainNonConfiguration机制)

2.没有设置configChanges,当由系统发起而非人为手动关闭Activity的时候,会触发Save-Restore InstanceState机制,当由配置发生改变而导致的Activity重建还会额外触发RetainNonConfiguration机制

3.如果两个方法同时出现时,onSaveInstanceState()方法执行在先,而onRetainNonConfigurationInstance()方法执行在后。它们的执行顺序都在onStop()和onDestroy()之间

4.Save-Restore InstanceState机制的初衷是保存界面的一些瞬时状态,常保存一些比较轻量级的数据,因为保存过程需要经历数据的序列化和反序列化;RetainNonConfigurationInstance机制用于保存配置发生前的数据,这个数据理论上是没有结构和大小限制

4.Activity onDestory的时候,会通过isChangingConfigurations()方法判断activity是否处于配置变化状态,如果不是就会将viewmodelstores清空掉。

5.在activityrelaunch过程中,销毁时调用onRetainNonConfigurationInstance保存了viewModelStore,create时在取读取该viewModelStore,完成了配置改变后viewmodel的数据保存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/478061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 Google MediaPipe 进行人体姿势估计演示

用于人体姿势估计的 MediaPipe 演示 MediaPipe简介 MediaPipe是一个开源框架,用于构建跨平台、多模式应用机器学习管道。它由 Google 开发,旨在促进基于机器学习的功能的快速开发和部署,特别关注音频、视频和时间序列数据。 我可以将 MediaPi…

产品经理杂谈

像游戏一样设计联赛 1、通过互联网规模化,然后分析数据,哪里好,哪里不好,大家都喜欢你的产品了,然后反哺更大规模 2、产品分类 toC 工具 内容 游戏 社交 电商 交易 toB 内部办公类 – 提高企业内部效率,…

力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.20 可通过leetcode所有测试用例。 目录 52. N 皇后 II 解题思路 完整代码 Python Java 53. 最大子数组…

TS + Vue3 elementUI 表格列表中如何方便的标识不同类型的内容,颜色区分 enum

TS Vue3 elementUI 表格列表中如何方便的标识不同类型的内容,颜色区分 enum 本文内容为 TypeScript 一、基础知识 在展示列表的时候,列表中的某个数据可能是一个类别,比如: enum EnumOrderStatus{"未受理" 1,"…

MySQL Workbench连接云服务器内网数据库

在项目上遇到一个问题,生产环境是Centos,分配了两台云服务器,一台应用服务,一台数据库服务,应用服务与数据库服务采用内网连接。我作为开发和运维方,有权限直接访问应用服务,但是数据库服务器需…

C++知识点总览

1.输入输出流 在C中要想输入和输出 我们会经常用到 #include <stdio.h>在C中头文件的命名风格不用.h #include <iostream>using namespace std;为什么要用上面俩句话的解释&#xff08;自己写的博客&#xff09; c中 为什么要写&#xff1c;iostream&#xff1e;…

苹果计划与谷歌合作使用Gemini AI技术,提升iPhone功能,同时探索与OpenAI合作可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

面试算法-73-二叉树的最小深度

题目 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 解 class Solu…

人工智能时代的引领者:AI提示工程激发大语言模型的无限潜能

文章目录 一、AI提示工程的概念与定义二、AI提示工程的应用领域三、AI提示工程的技术创新与突破四、AI提示工程的未来发展趋势《AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型》亮点内容简介作者简介目录 一、AI提示工程的概念与定义 在当今日新月异的科…

智能新纪元:AI大模型的奥秘与未来

目录 AI大模型学习 数学基础和编程能力 特定领域的业务理解 模型结构和算法的优化 为人类生活和工作带来的便利 AI大模型背后的技术原理 AI大模型学习的理论基础 1. 统计学习理论 2. 优化理论 3. 神经网络和深度学习 4. 表示学习 5. 迁移学习和微调 6. 机器学习的…

[数据集][目标检测]高质量铁路轨道缺陷检测数据集VOC+YOLO格式1050张6类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1050 标注数量(xml文件个数)&#xff1a;1050 标注数量(txt文件个数)&#xff1a;1050 标注…

Spring Web MVC入门(6)

应用分层 在开发的过程中, 我们会发现, 程序的代码有时会很"杂乱", 如果后面的项目更大了, 那就会更加地杂乱无章(文件乱, 代码内容乱). 也基于此, 接下来让我们来学习一下应用分层. 也类似于公司的组织架构 公司初创阶段, 一个人身兼数职, 既做财务, 又做人事,还有…

【C++】stringstream类 最全超详细解析(什么是stringstream? stringstrem有哪些作用? 如何在算法中应用?)

目录 一、前言 二、stringstream 是什么 &#xff1f; 三、stringstream 的用法 ✨构造函数 ✨输出字符串 ✨两种构造函数带来的不同 ✨修改、清空 stringstream 内容 四、stringsteam 的用途 ✨ 利用 stringstream 去除字符串空格 ✨ 利用 stringstream 指定字符分割字符…

【RPG Maker MV 仿新仙剑 战斗场景UI (六)】

RPG Maker MV 仿新仙剑 战斗场景UI 六 法术战斗窗口代码仿新仙剑效果 法术战斗窗口 这次来水点内容 由于之前已经做过了仿新仙剑的法术及物品窗口因此本次两篇内容&#xff0c;就来水点内容&#xff01;&#xff01;&#xff01; 由于帮助窗口之前已经做过&#xff0c;因此直接…

课程思政元素收集遴选系统|基于JSP技术+ Mysql+Java+ B/S结构的课程思政元素收集遴选系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

CVPR 2024 | 长时舞蹈生成:数秒钟可生成极长的3D舞蹈

论文题目&#xff1a; Transparent Image Layer Diffusion using Latent Transparency 论文链接&#xff1a; https://arxiv.org/abs/2402.17113 代码仓库&#xff1a; GitHub - layerdiffusion/LayerDiffuse: Transparent Image Layer Diffusion using Latent Transparency 目…

PR无法在指定轨道上粘贴

在Adobe Premier Pro 2022中&#xff0c;按照视频教程复制(Ctrl C)、粘贴(Ctrl V)一段视频素材时&#xff0c;不能粘贴到点亮的轨道上&#xff0c;尝试了几次都不行。 最后找到了原因。 在快捷键设置中&#xff0c;发现CtrlV快捷键对应的是&#xff0c;粘贴到同一轨道&…

在线教育资源管理系统|基于JSP技术+ Mysql+Java的在线教育资源管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

一文了解AI长文本工具:Kimi Chat;与ChatGPT比较对比

一文了解AI长文本工具&#xff1a;Kimi Chat&#xff1b;与ChatGPT比较对比 在人工智能领域&#xff0c;ChatGPT、Claude2.1和Kimi Chat都是备受关注的大型模型。它们在文本生成、理解和处理方面展现了强大的能力。本文将深入探讨这三个工具的核心功能、优劣势以及适用场景&am…

人工智能驱动的对话背后的魔力

未来交流革命&#xff1a;了解对话式AI的关键优势 在不断发展的技术世界中&#xff0c;人工智能驱动的对话处于创新的前沿&#xff0c;改变了企业与客户互动和管理关系的方式。 这篇博文深入探讨了对话式人工智能的迷人世界&#xff0c;探讨了其当前的趋势、应用程序以及它在重…
最新文章