LifeCycle

一、什么是Lifecycle

具备宿主生命周期感知能力的组件。它能持有组件(如Activity或Fragment)生命周期状态的信息,并且允许其他观察者监听宿主的状态。

二、基本原理

1、安卓10以下版本

隐形的Fragment注入在LifecycleOwner(宿主页面)中,当Fragment感知到宿主生命周期变化时,通知LifecycleRegister进行状态修改,然后LifecycleRegister通知LifecycleObserver进行具体的操作。

2、安卓10以上版本

不再需要隐形Fragment,直接使用系统回调(lifecyclecallback)

三、五大金刚

1、ReportFragment:隐形fragment,同步感知activity的声明周期变化,通知给LifecycleRegister(被宿主LifecycleOwner持有)

2、LifecycleRegister:Lifecycle 的具体实现类,更新状态并通知观察者。

3、LifecycleObserver:观察生命周期变化的接口

4、LifecycleOwner:生命周期的持有页面。

5、Lifecycle:定义生命周期状态和事件的抽象接口。

四、为什么Deportment可以感知宿主Activity的生命周期

Android 系统保证 Fragment 的生命周期方法100% 同步宿主 Activity。

public class ReportFragment extends Fragment {// ✅ 1. 注入到 Activitypublic static void injectIfNeededIn(Activity activity) {if (Build.VERSION.SDK_INT >= 29) {// Android 10+ 使用更高效的 APILifecycleCallbacks.registerIn(activity);}// 添加透明 Fragment(兼容旧版本)android.app.FragmentManager manager = activity.getFragmentManager();if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();manager.executePendingTransactions();}}// ✅ 2. 生命周期同步方法(核心)@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatch(Lifecycle.Event.ON_CREATE);}@Overridepublic void onStart() {super.onStart();dispatch(Lifecycle.Event.ON_START);}@Overridepublic void onResume() {super.onResume();dispatch(Lifecycle.Event.ON_RESUME);}@Overridepublic void onPause() {super.onPause();dispatch(Lifecycle.Event.ON_PAUSE);}@Overridepublic void onStop() {super.onStop();dispatch(Lifecycle.Event.ON_STOP);}@Overridepublic void onDestroy() {super.onDestroy();dispatch(Lifecycle.Event.ON_DESTROY);}// ✅ 3. 事件分发核心方法private void dispatch(Lifecycle.Event event) {if (Build.VERSION.SDK_INT < 29) {// 仅旧版本需要 ReportFragment 分发事件dispatch(getActivity(), event);}}// ⚡ 实际分发逻辑(静态方法可独立调用)public static void dispatch(Activity activity, Lifecycle.Event event) {if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();if (lifecycle instanceof LifecycleRegistry) {((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);}}}// ✅ 4. Android 10+ 的优化实现@RequiresApi(29)static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {static void registerIn(Activity activity) {activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());}@Overridepublic void onActivityCreated(@NonNull Activity activity, Bundle bundle) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_CREATE);}@Overridepublic void onActivityStarted(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_START);}@Overridepublic void onActivityResumed(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_RESUME);}@Overridepublic void onActivityPaused(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_PAUSE);}@Overridepublic void onActivityStopped(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_STOP);}@Overridepublic void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) {// 不处理}@Overridepublic void onActivityDestroyed(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_DESTROY);}}
}

参考文章:

【Android: 彻底搞懂Lifcycle——原理篇 - CSDN App】https://blog.csdn.net/sange77/article/details/125131212?sharetype=blogdetail&shareId=125131212&sharerefer=APP&sharesource=y515278178&sharefrom=link

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

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

相关文章

CSS 圆角边框属性(`border-radius`)笔记

一、作用&#xff1a; 用于设置元素四个角的圆角效果&#xff0c;让元素不再死板&#xff0c;更加柔和。 二、基本语法&#xff1a; border-radius: 圆角大小; 单位&#xff1a;px&#xff08;像素&#xff09;或 %&#xff08;百分比&#xff09; 示例&#xff1a; div {  …

python自助棋牌室管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

计算机——硬盘分区和格式化

硬盘驱动器 硬盘驱动器&#xff08;HDD&#xff09;是一种成熟、经济的大容量存储解决方案。它的核心优势在于每GB成本低和超大容量。然而&#xff0c;其机械结构带来的速度瓶颈、噪音、功耗和对物理冲击的敏感性是其主要的缺点。随着 SSD 价格的持续下降和性能的绝对领先&…

从IEC到UL:技术主权竞争下的断路器合规性战略

1 国际标准体系割裂的现状 在全球低压电器领域&#xff0c;国际标准体系呈现出日益明显的割裂态势。当前主要存在四大标准体系&#xff1a;国际通用的​​IEC标准体系​​、欧洲采用的​​EN标准体系​​、北美实施的​​UL与CSA标准体系​​&#xff0c;以及具有地域特色的​…

第十六届蓝桥杯_省赛B组(D).产值调整

题目如下 这道题看似很简单&#xff0c;其实还是得观察一下&#xff0c;要不然就会… 话不多说回到题目&#xff0c;这个题的坑就在于当A,B,C三个产值相同的时候&#xff0c;再怎么变还是之前的产值&#xff0c;或者也可以通过另外一种方法理解&#xff1a; 通过一个案例来举…

设计模式 | 单例模式——饿汉模式 懒汉模式

单例模式 文章目录 单例模式一、饿汉模式&#xff08;Eager Initialization&#xff09;1. 定义2. 特点3. 饿汉单例模式&#xff08;定义时-类外初始化&#xff09;4. 实现细节 二、懒汉模式&#xff08;Lazy Initialization&#xff09;1. 定义2. 特点3. 懒汉单例模式&#xf…

dify本地部署及添加ollama模型(ubuntu24.04)

说明&#xff1a;ubuntu是虚拟机的&#xff0c;用的桥接模式&#xff0c;与本地同局域网不同ip地址。 参考VM虚拟机网络配置&#xff08;ubuntu24桥接模式&#xff09;&#xff1a;配置静态IP前提&#xff1a;需要有docker及docker-compose环境 参考ubuntu24安装docker及docker…

Python爬虫实战:研究multiprocessing相关技术

一、引言 1.1 研究背景与意义 随着互联网信息的爆炸式增长,网络爬虫已成为获取海量数据的重要工具。传统的单线程爬虫在面对大规模数据采集任务时效率低下,无法充分利用现代计算机多核 CPU 的优势。多线程爬虫虽然在一定程度上提高了效率,但受限于 Python 的全局解释器锁(…

6.18 redis面试题 日志 缓存淘汰过期删除 集群

Redis有哪2种持久化方式&#xff1f;分别的优缺点是什么&#xff1f; Redis 的重写 AOF 过程是由后台子进程 bgrewriteaof 来完成的。 过期删除策略和内存淘汰策略有什么区别&#xff1f; 内存淘汰策略是在内存满了的时候&#xff0c;redis 会触发内存淘汰策略&#xff0c;来淘…

什么时候会发生内存泄漏?

1. 内存泄漏是什么&#xff1f; 定义&#xff1a;内存泄漏是指程序中的对象已经不再需要&#xff0c;但由于被其他对象错误引用&#xff0c;导致垃圾回收器&#xff08;GC&#xff09;无法回收它&#xff0c;从而长期占用内存空间的现象。 2. 内存泄漏的危害 问题具体表现内存…

用RSA算法模拟类的适配器模式

“RAS算法”这个术语本身并不常见或标准&#xff0c;它可能指向两个主要领域的不同概念&#xff0c;具体取决于上下文&#xff1a; 更可能是拼写错误&#xff1a;指 RSA 算法&#xff08;密码学&#xff09; 这是最常见的情况。 “RAS” 极有可能是 “RSA” 的拼写错误。RSA 算…

CARSIM-与C#自动化测试方案

using System; using System.Runtime.InteropServices; using System.Collections.Generic;namespace CarSimAutomation {/// <summary>/// CarSim COM 自动化测试接口/// 封装所有 CarSim COM 功能用于自动化测试/// </summary>[ComVisible(true)][ClassInterface…

企微CRM系统中的任务分配与效率提升技巧

在数字化管理时代&#xff0c;企业微信(企微)与CRM系统的深度融合&#xff0c;为企业提供了更高效的客户管理与团队协作方案。企微CRM软件不仅整合了客户沟通、销售跟进、数据分析等功能&#xff0c;还能通过智能任务分配优化团队效率。本文将深入探讨企微CRM管理系统的任务分配…

day66—BFS—最短的桥(LeetCode-934)

题目描述 给你一个大小为 n x n 的二元矩阵 grid &#xff0c;其中 1 表示陆地&#xff0c;0 表示水域。 岛 是由四面相连的 1 形成的一个最大组&#xff0c;即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#xff0c;以使两座…

FramePack 安装指南(中文)

FramePack 安装指南&#xff08;中文&#xff09; -Windows FramePack 是最前沿的 AI 视频生成框架&#xff0c;以极小的硬件需求颠覆视频创作&#xff01;它能在仅 6GB 笔记本 GPU 内存上&#xff0c;驱动 13B 模型以 30 FPS 生成超长 120 秒视频&#xff0c;几乎无内容限制&…

Redis Sentinel 非集群模式高可用部署指南

1. Sentinel 在非集群模式的定位 一句话&#xff1a;在单主多从架构中&#xff0c;用 Sentinel 替你盯哨——探测故障、选举新主、通知客户端。 核心四职能&#xff1a; 职能作用点Monitoring定时 PING 主从&#xff0c;自身也互相探测Notification通过日志/PubSub/外部调用报…

2025Java面试八股文

文章目录 Java基础JVM多线程SpringSpring Boot数据库与SQL分布式系统其他 Java基础 自动装箱与拆箱&#xff1a;Java中基础数据类型与包装类之间的转换。例如&#xff0c;Integer x 1; 是装箱&#xff0c;int y x; 是拆箱。Object类常用方法&#xff1a;如clone()、getClass…

宝塔安装nginx-rtmp,音视频直播

前置&#xff1a;需要自己开发音视频直播&#xff0c; 注意不是实时音视频&#xff0c;不是一对一视频聊天&#xff0c;不是视频会议 方案有 srs &#xff0c;nginx-rtmp&#xff0c;live555&#xff0c;node-media-server&#xff0c;EasyDarwin等 今天是说 nginx-rtmp 怎么…

基于微信小程序和深度学习的宠物照片拍摄指导平台的设计与实现

文章目录 摘要前言绪论1. 课题背景2. 国内外现状与趋势2.1 国内研究现状2.2 国外研究现状2.3 发展趋势3. 课题内容相关技术与方法介绍1. 微信小程序开发技术2. 深度学习模型选型2.1 MobileNetV22.2 ResNet-503. 系统架构设计4. 关键技术实现4.1 实时拍摄指导4.2 多模态建议生成…

web布局02

Web 发展的每个不同时期都有新的技术为 Web 布局提供支持&#xff0c;但不管是哪个时期&#xff0c;Web 布局相关的概念和术语都是相同的。如果你想彻底或者更好地掌握 Web 布局&#xff0c;那么首先需要对 Web 布局相关的技术术语有所了解。 在这一节中&#xff0c;我们一起来…