2022 · 让我带你Jetpack架构组件从入门到精通 — Lifecycle

简介: 不是标题党!作者会尽力把文章写的更容易理解也更充满深度,本文也随作者的持续学习,持续更新,有问题欢迎在评论区提出~

前言

不是标题党!作者会尽力把文章写的更容易理解也更充满深度,本文也随作者的持续学习,持续更新,有问题欢迎在评论区提出~

最近更新时间:2022-06-17

介绍

Jetpack的正式亮相是在2018年的Google I/O大会上,距今已经过去了四年,在当初的基础上又多了许多的新组件,每个组件都给开发者提供了一个标准, 能够帮助开发者减少样板代码并编写可在各种 Android 版本和设备中一致运行的 代码,让开发者能够集中精力编写重要的业务代码。但是,也有很多Android工程师四年过去了都停留在:知道、了解过、但没用过。也有很多朋友想要好好学习Jetpack,但是又无奈网上的知识点太过分散。本系列文章目标就是带大家完整的学习Jetpack组件,由浅入深。

常用架构组件图

总架构.png

本系列源码地址:https://github.com/taxze6/Jetpack_learn/tree/main/Jetpack_basic_learn

现在就让我们进入Jetpack的世界,第一站就是Lifecycle生命周期管理组件!

ada.jpg

Lifecycle

🌟官方文档:https://developer.android.google.cn/jetpack/androidx/releases/lifecycle

🌟推荐阅读:深入理解AAC架构 - Lifecycle整体机制源码

🌟推荐阅读:Lifecycle,看完这次就真的懂了

我相信,在你第一次看见Lifecycle时,你会有下面四个疑问:

  • Lifecycle到底是什么呢?
  • 它是用来干什么的?
  • 它有什么优势呢?
  • 它要怎么用呢?

Lifecycle是什么:

  • life:生命,(某事物)的存在期
  • cycle:周期

Lifecycle就是生命周期的意思。它是一个生命周期感知型组件,用来感知响应别的组件,例如感知Activity和Fragment的生命周期状态的变化。

Lifecycle用来干什么:

💡 Lifecycle能够自动感知其他组件的生命周期,能够降低组件之间的耦合性。

在android开发中,生命周期这个词很重要,因为内存泄漏和它有很大很大的关系,内存泄漏的最主要原因是因为对象的内存无法被回收,短生命周期对象被长生命周期对象所引用时,短生命周期对象不使用时无法被回收…..情况下,就造成了内存泄漏。(此处留个坑,也许以后会写关于内存泄漏如何解决方面的知识,现在大家可以先看其他资料学习)

大家此时心里会想,我要管理生命周期,但是android的activity不是自带了生命周期的函数吗,我在它里面修改不就行了,你要说有耦合,那全抽到Base类中不就好了。办法总是有的嘛~ 确实,在平时开发时,我们会封装一个BaseActivity,然后让所有的Activity都继承于它。BaseActivity一般会覆写onCreate、onStart 、onResume、onPause、onStop、onDestroy以及onRestart函数,并在其中加上日志信息,方便观察每个活动的各种状态。我们可以想到封装BaseActivity,那么官方肯定也会想到,于是就出现了Lifecycle。

lifecycle有什么优势呢?

既然,我们自己封装BaseActivity就基本能够管理生命周期了,那么官方为何还要 推出Lifecycle这个组件呢?

优势:

  • Lifecycler实现了执行的逻辑和活动的分离,代码解耦并且增加了代码的额可读性
  • Lifecycler在活动结束时自定移除监听,避免了声明周期的问题

如何使用Lifecycle呢?

先来了解一下lifecycle的核心类:

  • Lifecycle

    Lifecycle是一个抽象类,实现子类为LifecycleRegistry

    class LifecycleRegistry extends Lifecycle{
      .......
    }
  • lifecycleRegister

    lifecycle的唯一子类,用于在生命周期变化时触发自身状态和相关观察者的订阅回调逻辑

  • LifecycleOwner

    用于连接有生命周期的对象

    public interface LifecycleOwner {
    @NonNull
        Lifecycle getLifecycle();
    }
  • LifecycleObserver

    Lifecycle观察者

  • State(Lifecycle的抽象类内部)

    表示当前生命周期所处状态

    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
        public boolean isAtLeast(@NonNull State state) {
                return compareTo(state) >= 0;
        }
    }
  • Event(Lifecycle的抽象类内部)

    当前生命周期改变对应的事件

    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY;
    ......
    }

在了解了这些类和接口的用处之后,再去学习如何使用和源码分析就简单很多了。

Lifecycle的使用:

  • gradle的引用

    dependencies {
            def lifecycle_version = "2.5.0-rc01"
            def arch_version = "2.1.0"
            kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
            implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
            implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
            implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
            implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version"
            testImplementation "androidx.arch.core:core-testing:$arch_version"
        }
    💡 这里可以发现我们导入了lifecycle-service,lifecycle-process这两个组件,因为,在新版的SDK中,Activity/Fragment已经默认实现了LifecycleOwner接口,针对Service,Android 单独提供了LifeCycleService,而不是像Activity、Fragment默认实现了LifeCycleOwner。针对Application,Android 提供了ProcessLifeCycleOwner 用于监听整个应用程序的生命周期。

现在就让我们用两种方式实现对Activity生命周期的监听吧

  • LifecycleObserver

我们需要创建一个MyLifecycleTest并继承于LifecycleObserver ,使用OnLifecycleEvent(此方法已过时),实现对生命周期的监听。

import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
​
//OnLifecycleEvent已经过时了
class MyLifecycleTest : LifecycleObserver {
    companion object{
        private const val TAG = "MyLifecycleTest"
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun create() {
        Log.d(TAG, "create: ")
    }
​
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun start() {
        Log.d(TAG, "start: ")
    }
​
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun resume() {
        Log.d(TAG, "resume: ")
    }
​
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun pause() {
        Log.d(TAG, "pause: ")
    }
​
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop() {
        Log.d(TAG, "stop: ")
    }
​
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun destroy() {
        Log.d(TAG, "destroy: ")
    }
​
    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    fun any() {
//        Log.d(TAG, "any: ")
    }
​
}

在MainActivity onCreate种调用addObserver方法新添加一个LifecycleObserver。

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
​
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lifecycle.addObserver(MyLifecycleTest())
    }
}

LifecycleObserver.png

  • 使用DefaultLifecycleObserver

使用它需要映入androidx.lifecycle:lifecycle-common-java8,如果项目中使用了java8或者开启java8特性,那么官方推荐使用DefaultLifecycleObserver替代的@OnLifecycleEvent 注解实现(因为现在注解已经被弃用了),包括预编译。

我们创建一个MyDefaultLifecycleObserver继承于DefaultLifecycleObserver

import android.util.Log
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
​
class MyDefaultLifecycleObserver : DefaultLifecycleObserver {
    companion object {
        private const val TAG = "MyDefaultLifecycleObserver"
    }
​
    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        Log.d(TAG, "onCreate: ")
    }
​
    override fun onStart(owner: LifecycleOwner) {
        super.onStart(owner)
        Log.d(TAG, "onStart: ")
    }
​
    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        Log.d(TAG, "onResume: ")
    }
​
    override fun onPause(owner: LifecycleOwner) {
        super.onPause(owner)
        Log.d(TAG, "onPause: ")
    }
​
    override fun onStop(owner: LifecycleOwner) {
        super.onStop(owner)
        Log.d(TAG, "onStop: ")
    }
​
    override fun onDestroy(owner: LifecycleOwner) {
        super.onDestroy(owner)
        Log.d(TAG, "onDestroy: ")
    }
}

然后我们再创建一个MyApplication

通过addObserver()Observer添加到LifecycleRegistry

使用ProcessLifecycleOwner.get().lifecycle.addObserver(MyDefaultLifecycleObserver())

import android.app.Application
import androidx.lifecycle.ProcessLifecycleOwner
​
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        ProcessLifecycleOwner.get().lifecycle.addObserver(MyDefaultLifecycleObserver())
    }
}

在AndroidManifest.xml中添加下面这行运行代码,当应用程序进程启动时,这个被指定的子类在任何应用的组件之前被实例化。

AndroidMainfest.png

运行.png

使用起来是很简单的,当然,这只是一个简单的例子,所以我们还需要探索一下Lifecycle的具体实现,并多多练习才能掌握好它。

举例几个Lifecycle的使用场景:

这里留下几个问题:

  • Lifecycle的创建方式有哪几种(有什么不同,推荐使用哪一种)?
  • Lifecycle是如何进行生命周期同步的?
  • Event事件和State状态是什么关系?
  • Lifecycle的注册,派发,感知的过程是怎么样的?
  • 什么叫做嵌套事件?发生的时机是什么?Lifecycle是如何解决的?

请大家自己先寻找一下答案,在Jetpack源码分析系列我们会详细分析(这个系列还没写🌝)。

基础系列:

2022 · 让我带你Jetpack架构组件从入门到精通 — Lifecycle (本文🌟)

2022 · 让我带你Jetpack架构组件从入门到精通 — ViewModel&LiveData

当你真的学会DataBinding后,你会发现“这玩意真香”!

Navigation — 这么好用的导航框架你确定不来看看?

在写业务时想要有更好的体验吗?那你不妨来看看Room这个框架!

以下部分还在码字,赶紧点个收藏吧🔥
2022 · 让我带你Jetpack架构组件从入门到精通 — Paging3

2022 · 让我带你Jetpack架构组件从入门到精通 — WorkManager

2022 · 让我带你Jetpack架构组件从入门到精通 — ViewPager2

2022 · 让我带你Jetpack架构组件从入门到精通 — 登录注册页面实战(MVVM)

进阶系列:

协程 + Retrofit网络请求状态封装

Room 缓存封装

.....

相关文章
|
2月前
|
消息中间件 存储 Java
RocketMQ(一):消息中间件缘起,一览整体架构及核心组件
【10月更文挑战第15天】本文介绍了消息中间件的基本概念和特点,重点解析了RocketMQ的整体架构和核心组件。消息中间件如RocketMQ、RabbitMQ、Kafka等,具备异步通信、持久化、削峰填谷、系统解耦等特点,适用于分布式系统。RocketMQ的架构包括NameServer、Broker、Producer、Consumer等组件,通过这些组件实现消息的生产、存储和消费。文章还提供了Spring Boot快速上手RocketMQ的示例代码,帮助读者快速入门。
|
21天前
|
机器学习/深度学习 资源调度 算法
图卷积网络入门:数学基础与架构设计
本文系统地阐述了图卷积网络的架构原理。通过简化数学表述并聚焦于矩阵运算的核心概念,详细解析了GCN的工作机制。
54 3
图卷积网络入门:数学基础与架构设计
|
28天前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
103 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
1月前
|
SQL 数据采集 分布式计算
【赵渝强老师】基于大数据组件的平台架构
本文介绍了大数据平台的总体架构及各层的功能。大数据平台架构分为五层:数据源层、数据采集层、大数据平台层、数据仓库层和应用层。其中,大数据平台层为核心,负责数据的存储和计算,支持离线和实时数据处理。数据仓库层则基于大数据平台构建数据模型,应用层则利用这些模型实现具体的应用场景。文中还提供了Lambda和Kappa架构的视频讲解。
170 3
【赵渝强老师】基于大数据组件的平台架构
|
29天前
|
消息中间件 Java Kafka
实时数仓Kappa架构:从入门到实战
【11月更文挑战第24天】随着大数据技术的不断发展,企业对实时数据处理和分析的需求日益增长。实时数仓(Real-Time Data Warehouse, RTDW)应运而生,其中Kappa架构作为一种简化的数据处理架构,通过统一的流处理框架,解决了传统Lambda架构中批处理和实时处理的复杂性。本文将深入探讨Kappa架构的历史背景、业务场景、功能点、优缺点、解决的问题以及底层原理,并详细介绍如何使用Java语言快速搭建一套实时数仓。
145 4
|
1月前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
116 3
|
2月前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
38 1
|
2月前
|
消息中间件 关系型数据库 Java
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
|
1月前
|
监控 API 持续交付
后端开发中的微服务架构:从入门到精通
【10月更文挑战第26天】 在当今的软件开发领域,微服务架构已经成为了众多企业和开发者的首选。本文将深入探讨微服务架构的核心概念、优势以及实施过程中可能遇到的挑战。我们将从基础开始,逐步深入了解如何构建、部署和管理微服务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的建议。
46 0
|
2月前
|
消息中间件 运维 NoSQL
基础架构组件选型及服务化
【10月更文挑战第15天】本文概述了分布式系统中常见的基础架构组件及其选型与服务化的重要性。