AI智能
改变未来

Jetpack架构组件学习(1)——LifeCycle的使用

原文地址:Jetpack架构组件学习(1)——LifeCycle的使用 | Stars-One的杂货小窝

要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝

最近有时间了,准备入坑Jetpack架构,第一篇就学个简单的

LifeCycle

,可以帮助开发者创建可感知生命周期的组件。

介绍

为什么需要

LifeCycle

组件?

在很多情况下,我们需要在

Activity

的相关生命周期中进行相关的初始化操作,比如上一节说到的EventBus,需要在

OnCreate()

onDestroy()

方法中进行绑定和解绑,我们可以使用此组件来简化操作(下面的例子即是使用

LifeCycle

去简化

EventBus

绑定

Activity

的操作)

LifeCycle

的本质原理就是观察者模式,其中有类

LifecycleOwner

(被观察者)和接口

LifecycleObserver

(观察者),通过观察者模式,即可实现对页面生命周期进行监听,从而减低代码耦合度

这里提下:

Support Library 26.1.0

及其以后的版本(含androidx),

Activity

Fragment

已经实现了

LifecycleOwner

接口

所以,我们可以直接在Activity 和Fragment中使用

getLifecycle()

方法来获取

lifecycle

对象,来添加观察者监听。

我是直接使用了androidx版本,所以基本使用是无需导入额外的依赖

由于

Activity

Fragment

实现了

LifecycleOwner

接口,所以,使用我们只需要创建我们的观察者对象,与

Activity

进行绑定即可

基本使用

下面以

EventBus

的初始化来讲解下使用方法

1.实现LifecycleObserver接口

前面也说到了,

LifeCycle

提供了一个接口类

LifecycleObserver

,这个接口里没有任何的方法,我们需要要定义个类去实现它,即可让该类成为一个

LifeCycle

观察者类

我们需要让一个类去实现此接口,由于

EventBus

需要绑定

Activity

对象,所以我们需要类提供一个构造方法来接收

Activity

对象

class EventBusInitiator(val context: Context) : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)fun register() {EventBus.getDefault().register(context)}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)fun unregister() {EventBus.getDefault().unregister(context)}}

那我们实现了接口类,如何让Lifecycle回调我们的方法呢?这里Lifecycle设计就和EventBus有些异曲同工之妙了,也是提供注解的方式,从而Activity在进入对应的生命周期会回调参数

OnLifecycleEvent

注解里的参数只接收对应的事件,事件有以下7种类型

  • ON_CREATE

    匹配Activity的onCreate事件

  • ON_START

    匹配Activity的onStart事件

  • ON_RESUME

    匹配Activity的onResume事件

  • ON_PAUSE

    匹配Activity的onStop事件

  • ON_STOP

    匹配Activity的onStop事件

  • ON_DESTROY

    匹配Activity的onDestroy事件

  • ON_ANY

    可以匹配任何的事件(每次Activity的生命周期发生变化,都会调用一次)

前6种就是和Activity中的生命周期保持对应,最后一种有点迷,不知道具体是在哪种情况下使用的

PS:在这篇文章中提到Android 架构组件之 LifeCycle详解 – SegmentFault 思否,有两种方式用来实现LifeCycle的监听

  • 实现DefultLifecyceObserver接口,然后重写里面生命周期方法;
  • 直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;

Lifecycle.java文档中是建议使用第一种方式,随着Java8成为主流,注解的方式会被弃用。

这里我也没细找文档去研究,也不知道是不是这回事,就我个人感觉使用注解的方式会比较舒服,智者见智仁者见仁吧

2.Activity注册观察者对象

在上面实现

LifecycleObserver

接口后,我们就有个类,当Activity生命周期发生改变的话,就会将事件分发给类中,前提是我们得让Activity注册这个类的对象,代码如下所示

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_event_bus)lifecycle.addObserver(EventBusInitiator(this))}

PS:如果是Java,是通过

getLifecycle()

方法获取LifeCycle对象

效果与之前的例子一样,点击按钮即可改变文字

补充-判断当前页面状态

LifeCycle中的状态有以下5种类型:

  • Lifecycle.State.CREATED
  • Lifecycle.State.DESTROYED
  • Lifecycle.State.RESUMED
  • Lifecycle.State.STARTED
  • Lifecycle.State.INITIALIZED

INITIALIZED

状态表示的是初始化完成,但

onCreate()

周期未开始的状态

而之后

CREATED

状态,标明是

onCreate()

周期已结束的状态,后面的依次类推

可以参考下面的

LifeCycle

状态改变和事件的解析图:

判断的话我们可以使用

LifeCycle

对象的

currentState

状态,如下代码:

//直接一个判断就完事了if (lifecycle.currentState == Lifecycle.State.INITIALIZED) {}//状态至少要是CREATEDlifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)

进阶使用

进阶使用中,需要引入依赖

implementation \'androidx.lifecycle:lifecycle-extensions:2.2.0\'

LifecycleService的使用

上述的只讲了Activity和Fragment的使用方法,如果我们想要Service中想要生命周期解耦,可以使用

LifecycleService

,其父类是Service,只不过里面已经实现了LifecycleOwner接口,所以用法是基本一样的

我们使用Android Studio快速新建一个Service

然后修改代码为下述代码:

class MyService : LifecycleService() {val TAG = "MyService"init {lifecycle.addObserver(MyServiceObserver())}override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {//开启服务就开启个线程Log.d(TAG, "onStartCommand: 执行")thread {for (i in 0..5) {Log.d(TAG, "线程打印: $i")Thread.sleep(1000)}}return super.onStartCommand(intent, flags, startId)}}class MyServiceObserver() : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)fun create() {Log.d("MyService", "Service中的oncreate方法执行了");}}

Service的生命周期和上述Activity的例子一样,这里不再赘述,日志打印如图所示

PS:记得在Activity中使用startService开启服务哦

想起来,之前还没写过Service的学习笔记:joy: 之后有空补上

ProcessLifecycleOwner的使用

除了上面的情况,有时候我们需要判断下APP是处于前台或后台,这个时候就可以使用

ProcessLifecycleOwner

,具体用法如下

需要我们自定义一个application,然后在其中注册观察者即可

class MyApplication: Application() {override fun onCreate() {super.onCreate()ProcessLifecycleOwner.get().lifecycle.addObserver(MyApplicationObserver())}}class MyApplicationObserver : LifecycleObserver{//在应用程序的整个生命周期中只会被调用一次@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)fun onCreate(){Log.e("application","Application onCreate方法执行了");}//在应用程序在前台出现时被调用@OnLifecycleEvent(Lifecycle.Event.ON_START)fun onStart(){Log.e("application","Application onStart方法执行了");}//在应用程序在前台出现时被调用@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)fun onResume(){Log.e("application","Application onResume方法执行了");}//在应用程序退出到后台时被调用@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)fun onPause(){Log.e("application","Application onPause方法执行了");}//在应用程序退出到后台时被调用@OnLifecycleEvent(Lifecycle.Event.ON_STOP)fun onStop(){Log.e("application","Application onStop方法执行了");}//永远不会被调用,系统不会分发调用ON_DESTROY事件@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)fun onDestroy(){Log.e("application","Application onDestroy方法执行了");}}

PS:记得在AndroidManifest中使用我们的这个自定义Application

日志输出如下图所示:

参考

  • Android架构之LifeCycle组件_冬瓜闯世界的博客-CSDN博客
  • Android 架构组件之 LifeCycle详解 – SegmentFault 思否
  • Android官方架构组件Lifecycle:生命周期组件详解&原理分析 – 简书
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Jetpack架构组件学习(1)——LifeCycle的使用