Android:Lifecycle

整体架构

在这里插入图片描述

LifecycleOwner

Lifecycle持有者
在ComponentActivity中new出来,所以Activity和Fragment自带
实现了LifecycleOwner接口的类 可以获得生命周期信息类Lifecycle
Fragment和Activity都已经实现了该接口

Lifecycle Registry

生命周期注册器
可以提交生命周期事件 持有LifecycleOwner的弱引用,避免内存泄漏

public LifecycleRegistry(@NonNull LifecycleOwner provider) {mLifecycleOwner = new WeakReference<>(provider);mState = INITIALIZED;}

Lifecycle

持有应用组件生命周期状态(如Activity/Fragment/LifecycleService)信息的抽象类
可以添加和移除监听器,获取当前状态 方法调用都只能在主线程调用

通过为Activity、Fragment添加空Fragment监听生命周期,即ReportFragment
这样就在ReportFragment生命周期方法中可分发对应事件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
dispatch()分发事件时会调用handleLifecycleEvent
在这里插入图片描述
getStateAfter会返回对应的状态
moveToState 负责同步状态,执行前STATE未同步
在这里插入图片描述
这里涉及到个变量 mOberverMap
这是key为LifecyclerObserver,值为ObserverWithState的map

ObserverWithState则是包含state和LifecyclerEventOberser的包装类
在这里插入图片描述
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0)
表示当前状态是否旧状态是否更小,由状态图可推导 生命周期执行了什么方法

State大小:DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED

如新状态时Resume,旧状态是start,说明执行了Pause方法,因为生命周期方法是顺序执行
backwardPass方法中调用了downEvent,来计算是执行了哪个生命周期方法,返回对应事件,然后进行分发dispatch,dispatch再调用Observer.onStateChanged通知LifecycleObserver

Event、State

Event、STATE
Event:
ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY STATE:
ON_CREATE、ON_STOP 对应 CREATED
ON_START、ON_PAUSE 对应 STARTED
ON_RESUME 对应 RESUME
ON_DESTROY 对应 DESTROYED
STATE对应生命周期状态

State大小:DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED
在这里插入图片描述

流程梳理

Lifecycle提供了个空Fragment作为被观察者,监听生命周期,在对应生命周期函数分发对应事件,收到事件后调用LifecycleRegistry的handleLifecycleEvent来得出新状态并更新状态,并同步观察者状态,同步方法会比较观察者状态和被观察者状态大小,得出执行了何种生命周期方法,并将其分发给对应观察者

简而言之就是,被观察者监听状态,更新自我状态后再通知观察者

使用

在Activity/Fragment中,因为已经实现了接口,自带LifecyclerOwner和LifecyclerRegister,可直接通过getLifeCycle获取LifeCycle,添加监视器等

在其余场合,可以通过实现接口LifecyclerOwner自行注册LifecyclerRegister

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx配置springboot+vue项目http跳转https

java生成证书 添加依赖 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.69</version></dependency> import org.bouncycastle.asn1.ASN1Encodable; import org.bounc…

Layout-静态模板结构搭建、字体图标引入、一级导航渲染、吸顶导航交互实现、Pinia优化重复请求【小兔鲜Vue3】

Layout-静态模板结构搭建 Layout模块静态模板搭建 LayoutNav.vue <script setup></script><template><nav class"app-topnav"><div class"container"><ul><template v-if"true"><li><a h…

Eclipse中有用的快捷键

Eclipse中有的快捷键自己记不清楚&#xff0c;但用起来又很方便&#xff0c;遇到了就放在这边备忘。 【CtrlO】快速定位某个类中的属性、方法 有时候&#xff0c;一个类中的属性、方法比较多&#xff0c;想用快捷键快速查找&#xff0c;提升效率。 举例&#xff1a;我想查找…

解决React18+ts项目导入模块的声明报错

路径配置 项目路径别名的配置 ts对指向src的目录提示是不支持的 所以需要手动配置符号指向 在vite.config.ts import path from path export default defineConfig({plugins:[react()],resolve:{alias:{"":path.resolve(__dirname, ./src)}} })但这时path模块引入会…

ubuntu git clone 失败

命令行报错如下&#xff1a; gitxxx.xx.com: Permission denied (publickey). fatal: 无法读取远程仓库。修改步骤&#xff1a; 1、.ssh权限配置问题 .ssh 文件夹权限 755 或 700 config 文件权限 644 id_rsa 文件权限 600 id_rsa.pub 文件权限 644 r&#xff1a;read 代表读…

基于pyqt和卷积网络CNN的中文汉字识别

直接上效果演示图&#xff1a; 通过点击按钮可以实现在画板上写汉字识别和加载图片识别两个功能。 视频演示和demo仓库地址在b站视频001期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 所有代码展示&#xff1a; 十分的简洁&#xff0c;主…

【Android Framework系列】第4章 PMS原理

1 PMS简介 PMS&#xff08;PackageManagerService&#xff09;是Android提供的包管理系统服务&#xff0c;它用来管理所有的包信息&#xff0c;包括应用安装、卸载、更新以及解析AndroidManifest.xml。通过解析每个安装应用的AndroidManifest.xml&#xff0c;将xml中的数据全部…

易基因: RRBS揭示基于DNA甲基化驱动基因的肾透明细胞癌预后模型的鉴定和验证|项目文章

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肾细胞癌&#xff08;RCC&#xff09;是最常见的肾癌亚型&#xff0c;每年超400万例新发病例&#xff0c;是泌尿系统恶性肿瘤导致的第二大死因。2%-70%的RCC为透明细胞RCC&#xff08;Cl…

HotSpot 垃圾收集器

HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器&#xff0c;每种收集器都有各自的特点&#xff0c;虽然我们要对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器&am…

Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 我附近的、酒店竞排

文章目录 ⛄引言一、我附近的酒店⛅需求分析⚡源码编写 二、酒店竞价排名⌚需求分析⏰修改搜索业务 ✅效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中…

账号安全总结-业务安全测试实操(27)

电子邮件账号泄露事件 电子邮箱业务基于计算机和通信网的信息传递业务,利用电信号传递和存储信息,为用户传送电子信函、文件数字传真、图像和数字化语音等各类型的信息。电子邮件最大的特点是,人们可以在任何地方、任何时间收、发信件,解决了时空的限制,大大提高了工作效…

【Java用法】Java在Linux下获取当前程序路径以及在Windows下获取当前路径对比

Java在Linux下获取当前程序路径以及在Windows下获取当前路径对比 log.info("分隔符&#xff1a;File.separator[{}]", File.separator); log.info("用户主目录&#xff1a;user.home[{}]", System.getProperties().getProperty("user.home")); l…