携手创造,一起生长!这是我参与「日新方案 8 月更文挑战」的第11天,点击查看活动概况

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

最近有时间了,预备入坑Jetpack架构,第一篇就学个简略的LifeCycle,能够协助开发者创立可感知生命周期的组件。

介绍

为什么需求LifeCycle组件?

在许多情况下,咱们需求在Activity的相关生命周期中进行相关的初始化操作,比如上一节说到的EventBus,需求在OnCreate()onDestroy()办法中进行绑定宽和绑,咱们能够运用此组件来简化操作(下面的比如便是运用LifeCycle去简化EventBus绑定Activity的操作)

LifeCycle的本质原理便是观察者形式,其中有类LifecycleOwner(被观察者)和接口LifecycleObserver(观察者),经过观察者形式,即可完结对页面生命周期进行监听,然后减低代码耦合度

这儿提下:

Support Library 26.1.0 及其今后的版别(含androidx),ActivityFragment 现已完结了LifecycleOwner 接口

所以,咱们能够直接在Activity 和Fragment中运用getLifecycle()办法来获取lifecycle目标,来增加观察者监听。

我是直接运用了androidx版别,所以根本运用是无需导入额定的依靠

因为ActivityFragment完结了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目标

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

效果与之前的比如相同,点击按钮即可改动文字

补充-判别当前页面状况

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

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

INITIALIZED状况表明的是初始化完结,但onCreate()周期未开端的状况

而之后CREATED状况,标明是onCreate()周期已结束的状况,后面的顺次类推

能够参阅下面的LifeCycle状况改动和事情的解析图:

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

判别的话咱们能够运用LifeCycle目标的currentState状况,如下代码:

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

进阶运用

进阶运用中,需求引入依靠

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

LifecycleService的运用

上述的只讲了Activity和Fragment的运用办法,如果咱们想要Service中想要生命周期解耦,能够运用LifecycleService,其父类是Service,只不过里边现已完结了LifecycleOwner接口,所以用法是根本相同的

咱们运用Android Studio快速新建一个Service

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

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

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

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敞开服务哦

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

想起来,之前还没写过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

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

日志输出如下图所示:

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

参阅

  • Android架构之LifeCycle组件_冬瓜闯世界的博客-CSDN博客
  • Android 架构组件之 LifeCycle详解 – SegmentFault 思否
  • Android官方架构组件Lifecycle:生命周期组件详解&原理剖析 – 简书