安卓Lifecycle的理解

安卓Lifecycle的理解

个人理解,仅供参考

简单使用
  • 自定义一个类(可以是一个自定义控件)实现LifecycleObserver接口
  • 这个类实现若干个你需要的生命周期方法,并在这些方法上用OnLifecycleEvent注解进行注释,注释中的值要写上对应的生命周期
  • 在用到这个类的Activity或Fragment中调用getLifecycle方法获得LifecycleRegistry,然后调用LifecycleRegistry的addObserver方法将这个类的实例添加进去就能自动检测生命周期的改变并自动响应
原理分析

要实现这样的效果,能直接想到的方法就是,在Activity或者Fragment生命周期改变的时候,我们想办法获取到我们自定义的类,然后调用一下这个类对应的生命周期方法,就能达到目的。
但这样直接改显然不现实,Activity和Fragment的代码是Google已经写好的,改不了;再者,每个类都这样改,耦合性太高。使用Google给我们提供了一个能实现这个效果的方法,就是Lifecycle组件。
以Activity举例:

  • 在ComponentAcitivity的onCreate方法中,调用了ReportFragment.injectIfNeededIn(this)。ReportFragment是一个没有UI界面的Fragment,它的主要作用就是Fragment自带的生命周期感知,在每个生命周期的回调方法里,去提供给我们自定义类一个回调生命周期的时机。injectIfNeededIn这个方法作用是通过传进来的activity获取FragmentManager后,将ReportFragment的实例创建出来并添加到这个fragmentManager中去,完成ReportFragment和ComponentActivity的绑定。
  • 在ReportFragment的各个生命周期方法中(onStart、onResume等),都会调用dispatch方法分发对应的生命周期状态。之后的调用流程dispatch - > handleLifecycleEvent -> moveToState -> sync -> backwardPass/forwardPass -> dispatchEvent -> onStateChanged
  • 其实到了handleLifecycleEvent 这个方法这我们可以稍微停一下,想想我们前面的问题。LifecycleRegistry就是一个总开关,我们无论需要定义多少个自定义类,都会需要添加到这个总开关这里,由总开关统一控制,当Activity生命周期改变,总开关跟着改变,在总开关改变的时候,我们就轮询添加进来的自定义类,挨个跟着改变。这样就解耦了,不需要每个自定义类都对应改一遍代码。
  • 值得一提的是,当我们将自定义类添加到LifecycleRegistry的时候,LifecycleRegistry并不是单纯地将我们的自定义类用LifecycleObserver存下来,而是将其包装成一个ObserverWithState类存下来。这个步骤的重点在于,在ObserverWithState的构造方法中又会将我们传入的自定义类包装成ReflectiveGenericLifecycleObserver,并且在ReflectiveGenericLifecycleObserver类的构造函数中会解析我们传入的自定义类,解析什么呢,解析注解,即我们在自定义类中每个生命周期方法上注解的onLifecycleEvent。将被注解的方法通过反射的方式,拿到方法的Method对象和对应的生命周期状态,存下来。如此我们上一步的轮询操作中,就能拿到正确的生命周期方法并执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值