Android Lifecyle

带你详细了解 Android Lifecycle Lifecycle 一个跟踪组件生命周期的东西 阅读详情

Lifecycle笔记

主要记录一下自己看源码的过程

既然我们要感知Activity的生命周期,首先我们需要一个观察者:

interface IObserer{
    //可以把你需要的生命周期单独拿出来
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate(owner:LifecycleOwner)

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    fun onLifecycleChange(owner:LifecycleOwner,event:Lifecycle.Event)
}

class MyObserver:IObserver{
    fun onCreate(owner:LifecycleOwner){
        //doSomeThing
    }
    fun onLifecycleChange(owner:LifecycleOwner,event:Lifecycle.Event){
        //doSomething
    }
}

观察者有了以后,就要想办法把他和生命周期关联起来

val myObserver = MyObserver()
lifecycle.addObserver(myObserver)

至此,我们已经可以在MyObserver中感知到Activity的生命周期变化

那么为什么这样就可以感知到生命周期变化呢

点开addObserver源码,发现该方法是属于Lifecycle抽象类的,那么就去找他的实现类

发现 SupportActivity中有个

 private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

那么就看LifecycleRegistry 的addObserver

 @Override
    public void addObserver(LifecycleObserver observer) {
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        // ① 
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        //把myObserver和statefulObserver添加到Map里去,这里我理解为ObserverWithState是用来通知myObserver生命周期变化的
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
        ......

    }

SupportActivity在onCreate的时候会添加一个ReportFragment汇报生命周期变化(类如其名)

class ReportFragment

//在onActivityCreated、onStart等生命周期方法中,均会调用dispatch
private void dispatch(Lifecycle.Event event) {
    Activity activity = getActivity();
    if (activity instanceof LifecycleRegistryOwner) {
        ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
        return;
    }
    if (activity instanceof LifecycleOwner) {
        Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
        if (lifecycle instanceof LifecycleRegistry) {
        //这里就又回到LifecycleRegistry类中了
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

handleLifecycleEvent最后会到这里

private void forwardPass() {
    Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =mObserverMap.iteratorWithAdditions();
    while (ascendingIterator.hasNext() && !mNewEventOccurred) {
        Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
        ObserverWithState observer = entry.getValue();
        while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            pushParentState(observer.mState);
            //这里进行事件分发,所以事件还是靠的ObserverWithState ,而不是myObserver(之前想岔了,总想着是myObserver来分发事件,)
            observer.dispatchEvent(mLifecycleOwner, upEvent(observer.mState));
            popParentState();
        }
    }
}

接下来进入ObserverWithState.dispatchEvent方法看下

 void dispatchEvent(LifecycleOwner owner, Event event) {
     State newState = getStateAfter(event);
     mState = min(mState, newState);
     //进行事件分发 见 ① 具体实现就是靠注解+反射来实现方法调用
     mLifecycleObserver.onStateChanged(owner, event);
     mState = newState;
 }
①
 static class ObserverWithState {
    State mState;
    GenericLifecycleObserver mLifecycleObserver;
    ObserverWithState(LifecycleObserver observer, State initialState) {
        // ② 这里会把myObserver包装成ReflectiveGenericLifecycleObserver,最终分发事件是靠这个类
        mLifecycleObserver = Lifecycling.getCallback(observer);
        mState = initialState;
    }
}

② 
ReflectiveGenericLifecycleObserver(Object wrapped) {
    //这个mWrapped 就是myObserver
    mWrapped = wrapped;
    mInfo = getInfo(mWrapped.getClass());
}

流程总结:(已感知生命周期变化为目的)

1、定义好我们自己的Observer(实现LifecycleObserver)
2、在Activity中通过lifecycle.addObserver(observer:LifecycleObserver)来关联生命周期
3、生命周期方法被调用时,ReportFragment向MyObserver汇报

lifecycle.addObserver里做的一些事情:
1、LifecycleRegistry把MyObserver和ObserverWithState对象添加到mObserverMap里以备后用
2、当生命周期发生变化是,ReportFragment通过SupportActivity的LifecycleRegistry 调用handleLifecycleEvent,最终从mObserverMap中取出ObserverWithState来分发事件
3、步骤1 中在创建ObserverWithState实例时,会在MyObserver外面包一层ReflectiveGenericLifecycleObserver,最终由ReflectiveGenericLifecycleObserver通过注解反射来调用MyObserver中由OnLifecycleEvent注解的方法

Android lifecyle 源码解剖 小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!资料⬅专栏获取。 阅读详情

相关推荐

Android-RxJava2RetrofitRxBusOkHttp3lifecycle封装实现所有请求

本框架 是对 RXJAVA2 Retrofit RxBus OkHttp 的架构的封装 达成目标:链式调用,简单明了 1.支持 主流的Http 请求 2.支持 多文件上传 监听进度 3.支持 大文件下载 监听进度

Lifecycle的使用和原理

{如果我们还有其他的监听操作,那每个生命周期的回调都要写一套,这样的方式太过繁琐,有了Lifecycle 我们的工作量就大大减轻了。如何使用:1. 创建一个观察者类2. 在Activity 初始化时注册观察者init {) {

JeffTang2020的博客 515

creo二次开发使用映射

在creo进行二次开发时,一些无法直接通过访问底层代码来对特征进行操作,比如“镜像装配”,这个时候就可以使用映射(Mapkey)来完成一键镜像。 注:这是镜像装配的代码 ProError status; ProMacro macro; wstring Macro; strMacro = L"mapkey(continued) ~ Command ProCmdMirrorAssem ; mapkey(continued) ~ Activate mirror_component_dialog Sy

qq_49328512的博客 1607

Android Jetpack 之 lifecycle入门,简单使用及分析

Lifecycle入门一、Lifecycle简介二、简单使用三、简单分析 一、Lifecycle简介 Lifecycle是Jetpack架构组件之一,是一个生命周期感知型组件。 作用就是使一个组件可以感知到另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。 在未使用生命周期感知型组件时,有一种常见模式,就是在生命周期方法中对依赖组件进行操作,例如,在Activity OnCreate()时调用组件内部的start()方法开启组件的功能,在Activity OnDestroy()时

weixin_44902943的博客 651

Tera Term介绍和使用指南

Tera Term 是一个用于 Windows 操作系统的免费终端模拟器和串口通信软件。它主要用于在计算机和其他设备之间建立串口通信连接,例如通过串行线缆连接到设备如路由器、开发板或嵌入式系统。Tera Term 支持多种通信协议和功能,包括 Telnet、SSH 和串口通信。提供了一个终端窗口,模拟了常见的终端类型,如VT100。支持通过串口与设备进行通信,可用于与嵌入式系统、微控制器等设备进行连接。提供 Telnet 和 SSH 功能,可用于通过网络连接到远程主机。

weixin_49423593的博客 1万+

从数据到特征:基于CAT12的MRI图像预处理实战指南

本文详细介绍了使用CAT12工具进行MRI图像预处理的完整实战流程。从数据获取、环境搭建到核心的AC-PC校正、组织分割、空间标准化与调制,逐步解析如何将原始脑影像数据转化为可用于机器学习的标准化特征图。重点阐述了预处理作为脑影像分析‘生命线’的重要性,并提供了避坑指南与自动化脚本建议,帮助研究者构建高质量的阿尔茨海默症分类模型输入特征。

weixin_29065959的博客 309

Android :安卓第一行代码学习笔记之 解析LifeCycle 的简单理解和使用

LifeCycles 的简单理解和使用LifeCycles参考 LifeCycles 参考 1、Jetpack系列学习笔记整理一 之LifeCycles 2、Android Jetpack架构组件之 Lifecycles(使用篇)

JMW1407的博客 3684

解决VMware与Hyper-V/Device Guard冲突的实用指南

本文详细解析了VMware与Hyper-V/Device Guard冲突的根源,并提供了三种实用的解决方案:彻底关闭相关功能、通过启动配置实现选择性引导,以及使用VMware Workstation Pro的Hyper-V兼容模式。指南包含清晰的诊断步骤、操作命令和避坑建议,帮助用户根据自身需求灵活选择,实现虚拟化环境的稳定运行或高效共存。

weixin_29306317的博客 684

Lifecyle的原理

4、Activity或Fragment的生命周期发生变化时,通过LifecycleRegistry的handleLifecycleEvent通知观察者的生命周期的变化。3、观察者通过LifeCycle对象的addObserver注册监听生命周期的变化,通过removeObserver移除监听生命周期的变化。1、Lifecycle是典型的观察者模式,被观察者的继承关系如上图所示。2、LifeCycleRegistry是Lifecycle的子类。

悟心的专栏 328

Jetbrains IDE 配置上Gemini Code 插件,让你的的编程高效起飞~

Gemini Code Assist是 Google 家产品,基座模型为最新的Gemini 2.5 Pro。本篇实践了在 WebStrom 中Gemini Code Assist插件的高效编程。

2301_76993408的博客 4594

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1164

Android lifecyle 源码解剖,android应用开发

public class CustomLifecycleActivity extends FragmentActivity implements LifecycleOwner { private LifecycleRegistry mLifecycleRegistry; private static final String TAG = “CustomLifecycleActivity”; @Override protected void onCreate(Bundle savedInstanceState

m0_66145060的博客 196

安装Anaconda和Labelme的教程

1 登录Anaconda官网,选择Download https://www.anaconda.com/distribution/ 2 选择你想下载的Python版本,选择你的操作系统和位数,然后点击Download按钮就开始下载了 3 开始安装 下面两个框框都勾选 点击next,等待安装成功 打开Anaconda Navigator 点击红色圈圈的按钮 在cmd中输入 (1)创建虚拟环境 conda create -n labelme python=3.6 (2)激活虚拟环境 conda activa

qq_42178122的博客 3808

Android lifecyle 源码解剖(1)

if (!sync();在 addObserver 方法中,它主要干这几件事情首先,先初始化状态, 判断当前 mState 是否是 DESTROYED,如果是将初始状态置为 DESTROYED,否则为 INITIALIZED,接着用 ObserverWithState 包装 observer 和 初始化状态 initialState。

2401_87555332的博客 826

【学习总结】飞跨电容三电平boost拓扑发波分析与matlab仿真

正常工作时,飞跨电容的电压大约控制在输出电压的一半,降低了开关器件的耐受电压。

晞子的技术札记 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android lifecyle 源码解剖,从三流Android外包到秒杀阿里P7

return;// 这里 mAddingObserverCounter 为 0 ,mHandlingEvent 为 falseif (!sync();在 addObserver 方法中,它主要干这几件事情首先,先初始化状态, 判断当前 mState 是否是 DESTROYED,如果是将初始状态置为 DESTROYED,否则为 INITIALIZED,接着用 ObserverWithState 包装 observer 和 初始化状态 initialState。

2401_84149530的博客 366

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android lifecyle 源码解剖,音视频开发进阶指南pdf

State targetState = calculateTargetState(observer); mAddingObserverCounter++; while ((statefulObserver.mState.compareTo(targetState) < 0 && mObserverMap.contains(observer))) { pushParentState(statefulObserver.mState); statefulObserver.dispatchEv

m0_64382743的博客 521

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

阿里面试官必问,Android lifecyle 源码解剖,我阿里P7了解到的Android面试的一些小内幕

以前一直是自己在网上东平西凑的找,找到的东西也是零零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。后面我就自己整理了一套资料,还别说,真香!资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

2401_84023604的博客 804
上一篇: Base64学习
普通网友
博客等级 码龄12年 7粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值