Jetpack -lifecycle原理

717 阅读3分钟

Android架构化框架推荐我们使用生命周期感知型组件处理生命周期。

一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。但是,这种模式会导致代码条理性很差而且会扩散错误。通过使用生命周期感知型组件,可以将依赖组件的代码从生命周期方法移入组件本身中。

androidx.lifecycle 软件包提供了可用于构建生命周期感知型组件的类和接口 - 这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。所以我们看下lifecycle原理

1. lifecycle是什么?

Liftcycle是一个类,用于存储有关组件(Activity)的生命状态信息,并允许其他组件观察此状态信息

Liftcycle使用两种枚举关联组件的生命周期状态
  • 事件 从框架和Liftcycle分派的生命周期事件,这些事件映射到Activity的生命周期回调

  • 状态 由Lifecycle跟踪的组件的生命周期状态

20220527154308.jpg 将状态看做节点,事件是连接的线条

2.Liftcycle的源码分析

我们知道我们使用Lifecycle时,会自定义Observer实现LifecycleObserver接口,在持有生命组件(Activity或Fragment等)调用 addObserver()方法,不用时调用removeObserver()方法。所以我们先看看addObserver()方法。

20220527160825.jpg addObserver()是一个抽象方法,我们看看它的具体实现

20220527160801.jpg

首先我们看到了State,想到我们刚开始说的状态与事件,我们看看State与(事件)Event

20220527161213.jpg

20220527161248.jpg 都是一些枚举值,事件和状态的关系如我们开篇的图。Event对应组件的生命周期事件。State对应组件的生命周期状态。

继续往下看,new ObserverWithState()

20220527162201.jpg就是对observer和state赋值操作,下面还有个dispatchEvent()方法,所以推测构建这个对象,会调用此方法。不着急,我们再往下看,将observer(我们创建的observer)和ObserverWithState放进了一个 FastSafeIterableMap中,移除的时候在从这个map中remove掉。下面就是获取LifecycleOwner这个生命周期持有者也就是我们的Activity。如果为空则不处理,即Activity退出了。在下面就是

20220527163521.jpg计算activity生命周期状态,通过while循环,同步activity的状态到观察者的状态即我们添加的Observer。while循环为了处理新加入的观察者。后面判断isReentrance如果是false,则调用sync()方法。这个标记是个啥?

它就是一个标记位,标记我们加入的observer是否同步了最新的生命周期状态,或者是否正在执行状态同步操作(mHandlingEvent)

20220527165647.jpg

20220527165712.jpg 调用sync方法同步状态,isSynced()方法, 当链表第一个和最后一个节点状态一样 且 状态等于最后一个节点才认为是同步完成。然后通过倒序遍历

20220527170106.jpg 正向遍历

20220527170123.jpg 所以sync方法的作用就是让所有观察者完成状态迁移,并完成相应的事件分发

小结: 当我们的Activity处于Onresume状态,这时触发了生命周期改变到onpause,然后会把ON_PAUSE通过getTargetState方法获取是STARTED状态,然后需要进行回退降级处理,在sync方法中会发现isSynced方法返回false,然后还会发现STARTED小于链表最开始的ON_PAUSE,所以要回退,在回退中依然保证该列表的特性:链表后面节点的状态不能大于前面的。