Android Jetpack架构组件之Lifecycle原理篇

        上一篇文章介绍过了Jetpack的Lifecycle的简单使用,使用起来非常方便,帮我们节省了很多复杂的代码,就能允许其他对象对生命周期的感知。这篇文章从Google源码分析其原理。

源码环境:Androidx

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.testproject"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
    }
}

一、源码分析Lifecycle的原理

先从使用的时候最简单代码的地方着手:

从AppCompatActivity.java开始跟踪进去:AppCompatActivity.java----->FragmentActivity.java---->ComponentActivity.java---->androidx.core.app.ComponentActivity.java---->Activity.java;

上面的继承关系中,ComponentActivity.java和androidx.core.app.ComponentActivity.java都实现了LifecycleOwner这个接口,就表明我们的TestActivity是生命周期的拥有者:

其中我们写的代码的getLifecycle()就在第一个ComponentActivity.java中:

获取到的对象是LifecycleRegistry,是抽象类Lifecycle目前(2021.6.22)的唯一的子类。

这行代码getLifecycle().addObserver(new Test());就先看分析到这里,等下再回头看。这里留有一个悬念,没有解释addObserver这个方法

接下来我们转到androidx.core.app.ComponentActivity.java这个类:在这个类的生命周期onCreate()方法中:

跟踪进去上面红框中的方法:

可以看到,实际上是给我们的activity添加add了一个ReportFragment,这个fragment是没有界面的,依附在传进来的activity参数上面。ReportFragment的生命周期存在:

可以看到在每个生命周期的方法中都把自己的状态分发处理了,dispatch(Event event);

因为我们的activity实现了LifecycleOwner;接着进入handleLifecycleEvent(event),把生命周期的状态传进去了。通过LifecycleRegistry分发对应生命周期事件Lifecycle.Event。

getStateAfter这个方法就是根据生命周期Event(大枚举),合并某些生命周期状态并返回State(枚举)。

接着把合并得到的State状态传给这个方法:moveToState(next);

接着进入同步sync()这个方法看看:

forwardPass(lifecycleOwner)、backwardPass(lifecycleOwner)代码差不多,就是一个往前一个往后的判断:

迭代mObserverMap取到LifecycleObserver包装类调用ObserverWithState;

这里就涉及到一个问题了,上面的向前和向后的两个方法中的这个mObserverMap集合数据哪来的呢?addObserver方法

这里就要解释上面留下的那个悬念了,这个mObserverMap就是在上面的这段代码中:getLifecycle().addObserver(new Test());被观察者添加了观察者,跟进源码分析:

addObserver方法是Lifecycle抽象类的一个抽象方法,具体实现交给唯一的实现类LifecycleRegistry

在这个具体实现的方法中,我们的观察者observer又被ObserverWithState包装了一层:Lifecycling.lifecycleEventObserver(observer),然后mObserverMap.putIfAbsent()添加到集合中

在Lifecycling.lifecycleEventObserver(observer)这个方法中,会将observer对象包装成LifecycleEventObserver的各种实现类:

  • FullLifecycleObserverAdapter
  • LifecycleEventObserver
  • SingleGeneratedAdapterObserver
  • CompositeGeneratedAdaptersObserver
  • ReflectiveGenericLifecycleObserver
mLifecycleObserver.onStateChanged(owner, event);通过以上实现类执行onStateChanged();

在上篇文章中,我们使用的是注解的方式来实现的,对应的就ReflectiveGenericLifecycleObserver这个实现类,接下来看看这个反射的集合类如何执行的:构造方法将observer传进去:

接着看如何反射调用Test.java中的被打上@OnLifecycleEvent注解的方法:

mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());

这行代码就是拿到观察者对象的反射的相关信息:

在那个向前向后的方法中forwardPass、backwardPass会调到onStateChanged(),因此会在这个方法中执行反射相关的代码,从而会执行我们Test.java对应的方法。

上图就是从集合中遍历,集合中保存了相应的事件(如打开的时候就有oncreate、onstart、onresume这三个)

以下是我打开界面的时候的debug,首先会走oncreate,后面接着会走onstart和onresume,我只截图了oncreate。

原理比较清晰:Activity/Fragment实现LifecycleOwner接口,通过LifecycleRegistry在对应生命周期分发事件Lifecycle.Event,回调到生命周期观察者LifecycleObserver对应订阅方法。

有些细节需要自己看源码慢慢领悟,比如那几个集合的转换,如何数据添加,反射带参和不带参的标志位mCallType,和LifecycleEventObserver的其他的几个实现类。


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《Jetpack架构组件从入门到精通》.pdf 是一本介绍Android Jetpack架构组件的书籍。Jetpack是Google官方提供的一套组件库,旨在帮助开发者更轻松地构建高质量的Android应用程序。 这本书从入门到精通地介绍了Jetpack架构组件的各个方面。首先,它详细解释了Jetpack的基本概念和使用方法。读者可以学习到Jetpack的核心组件,如ViewModel、LiveData、Room和Navigation等,以及它们在构建Android应用时的作用。 此外,这本书还介绍了Jetpack架构组件的一些高级技术和最佳实践。读者可以学习到如何使用WorkManager实现后台任务,如何使用DataBinding进行数据绑定,以及如何使用Paging构建分页列表等。 除了介绍Jetpack架构组件的基本用法和高级技术,这本书还提供了一些实际应用示例和案例分析。读者可以通过参考这些示例来更好地理解和应用Jetpack架构组件。 总之,《Jetpack架构组件从入门到精通》.pdf 是一本全面而深入地介绍Jetpack架构组件的书籍。无论是初学者还是有一定经验的开发者,都可以通过阅读这本书来提升自己在Android应用开发中使用Jetpack的能力。 ### 回答2: 《Jetpack架构组件从入门到精通》.pdf 是一本关于Jetpack架构组件的学习指南。JetpackAndroid开发中一套强大而且灵活的组件集合,旨在帮助开发者更轻松地构建高质量的Android应用程序。 该PDF文件从入门到精通地介绍了Jetpack架构组件的各个方面。首先,它向读者介绍了Jetpack的概念和使用场景,以帮助读者了解为什么应该学习和使用这些组件。 接下来,该指南逐一介绍了Jetpack架构组件的不同模块,包括ViewModel、LiveData、Room、Navigation等。它详细解释了每个组件的功能和用法,并通过实际示例演示了如何在项目中使用它们。 此外,该指南还提供了一些常见的最佳实践和实用技巧,以帮助读者更好地理解和运用Jetpack架构组件。它还包含了一些常见问题和解决方案,帮助读者避免在实践中遇到的常见问题。 最后,该指南还提供了一些参考资料和进一步学习资源,以帮助读者深入学习和掌握Jetpack架构组件。 总的来说,该《Jetpack架构组件从入门到精通》.pdf提供了一个全面而详尽的学习指南,帮助读者了解和应用Jetpack架构组件,使他们能够更高效地构建高质量的Android应用程序。无论是初学者还是有经验的开发者,该指南都是一个值得阅读和参考的资源。 ### 回答3: 《Jetpack架构组件从入门到精通》.pdf 是一本介绍Android Jetpack架构组件的电子书,它有助于开发者学习和理解如何使用这些组件来构建高质量、稳定的Android应用程序。 Jetpack架构组件是由谷歌开发的一组库,旨在帮助开发者简化Android应用的开发过程。它提供了一系列的工具和组件,涵盖了各个方面,包括界面设计、数据库、网络通信、数据绑定、后台处理等。 这本电子书从入门到精通地介绍了各个组件的使用方法和最佳实践。它首先详细介绍了Jetpack架构组件的核心概念和优势,让读者了解为什么要使用这些组件。 然后,电子书逐一介绍了常用的Jetpack组件,如Lifecycle、ViewModel、Room、LiveData、Navigation等。每个组件都被详细地讲解,包括其作用、使用方法和示例代码。读者可以通过跟随书中的案例来实际操作和理解这些组件的使用。 除了介绍各个组件,电子书还分享了一些进阶的使用技巧和开发经验。这些技巧包括如何优化应用性能、处理异步任务、实现数据缓存等。通过这些实用的技巧,开发者可以进一步提高应用的质量和用户体验。 总的来说,《Jetpack架构组件从入门到精通》.pdf 是一本很有价值的学习资料,对于想要深入学习和掌握Jetpack架构组件的开发者来说是必不可少的参考书籍。无论是初学者还是有经验的开发者,都可以从中获得知识和技能的提升。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值