Jetpack组件(三)Lifecycle

   本篇是Jetpack组件系列文章的第三篇,将介绍第二个组件Lifecycle。Lifecycle为开发者管理 Activity 和 Fragment 生命周期提供了极大的便利,帮助开发者书写更轻量、易于维护的代码。

目录

一、友情提示

二、Lifecycle简介

1、状态

2、事件

三、Lifecycle基本使用

1、gradle导入lifecycle

2、自定义MainLifecycle 

3、添加Observer

四、Lifecycle扩展

1、多Activity生命周期监听

2、区分具体的Activity


一、友情提示

Jetpack组件构成图

在这里插入图片描述

Jetpack组件系列上一篇
Jetpack组件(二)DataBinding_heart荼毒的博客-CSDN博客一直在犹豫去写Jetpack组件的一系列文章,实话实说,我本身的项目中也很少有使用到Jetpack的一些库。那么在写文章之前,我还是要去实际的写demo。准备按照Architecture(架构)、Foundation(基础)、Behavior(行为)和UI(界面)的顺序去写。本篇先总结一下DataBinding的使用。https://blog.csdn.net/qq_21154101/article/details/128111485

Jetpack组件系列下一篇​​​​​​​​​​​​​​​​​​​​

Jetpack组件(四)LiveData_heart荼毒的博客-CSDN博客LiveData是一个可观察的数据类,而且可感知Activity、Fragment、Service的生命周期,确保LiveData仅更新处于活动生命周期状态的组件观察者。https://blog.csdn.net/qq_21154101/article/details/128536704

二、Lifecycle简介

    Lifecycle用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观察此状态。Lifecycle使用事件和状态两种枚举跟踪其关联组件的生命周期状态,以下是官方的图片:

     对以上图片的流程稍加文字说明

1、状态

    状态即activity或fragment的生命周期状态,从初始态INITIALIZED开始,启动activity或fragment分别经过onCreat > onStart > onResume,而与此对应的销毁生命周期为onPause > onStop > onDestroy

2、事件

    Lifecycle持有界面的生命周期状态信息,允许其他观察者去观察其持有的状态。那如何通知其他观察者?毫无疑问是通过事件Event来的,分别有ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP和ON_DESTROY。当界面的生命周期发生变化时,就会产生相应的事件。

三、Lifecycle基本使用

1、gradle导入lifecycle

    直接导入androidx.lifecycle的最新稳定版本2.5.1

implementation 'androidx.lifecycle:lifecycle-common:2.5.1'

2、自定义MainLifecycle 

    第一种方式是一种官方已经废弃的方式。实现LifecycleObserver接口,并自定义生命周期回调的方法,然后通过注解的方式实现生命周期的绑定和监听:

package com.example.jetpackdemo.lifecycle;

import android.util.Log;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

public class MainLifecycle implements LifecycleObserver {
    private static final String TAG = "MainLifeCycle";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate() {
        Log.d(TAG, "onCreate");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart() {
        Log.d(TAG, "onStart");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume() {
        Log.d(TAG, "onResume");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause() {
        Log.d(TAG, "onPause");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop() {
        Log.d(TAG, "onStop");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestroy() {
        Log.d(TAG, "onDestroy");
    }
}

    上面这种方式官方已经废弃了不推荐使用,第二种方式则是实现DefaultLifecycleObserver接口:

package com.example.jetpackdemo.lifecycle;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;

public class SimpleLifecycle implements DefaultLifecycleObserver {
    private static final String TAG = "SimpleLifecycle";
    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onCreate(owner);
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStart(owner);
        Log.d(TAG, "onStart");
    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onResume(owner);
        Log.d(TAG, "onResume");
    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onPause(owner);
        Log.d(TAG, "onPause");
    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStop(owner);
        Log.d(TAG, "onStop");
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onDestroy(owner);
        Log.d(TAG, "onDestroy");
    }
}

3、添加Observer

    通过上面的步骤,实际上就是创建了一个观察者,而被观察者实际上就是LifecycleOwner。Activity和fragment都实现了LifecycleOwner接口:

     LifecycleOwner接口只有一个getLifecycle方法: 

​​​​​​​

    因此,我们在Activity的onCreate中去 添加Observer,实现对当前Activity生命周期的监听:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        getLifecycle().addObserver(new SimpleLifecycle());
        initInfo(binding);
    }

     以下是Activity生命周期切换过程中,SimpleLifecycle打印的日志:

四、Lifecycle扩展

    在实际的项目中,我们不仅仅有一个Activity,那么,如果我们想监听多个Activity的生命周期,该怎么做呢?

1、多Activity生命周期监听

    上面我们也提到了,Lifecycle本身的实现其实就是观察者模式。那么,我们可以让观察者去观察多个Activity的生命周期。如下示例,我新创建一个SecondActivity,在MainActivity中点击一个按钮打开SecondActivity,只需要在SecondActivity的onCreate中添加Observer即可:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        getLifecycle().addObserver(new SimpleLifecycle());
    }
}

启动MainActivity,打开SecondActivity,我们看下日志:

​​​​​​​

    可能大家跟我一样,看这个日志觉得有点乱,到底是哪个Activity?没错,添加了对多个Activity的监听后,如果不区分Activity,看这个日志确实是难受。接下来,我们优化这个问题。

2、区分具体的Activity

    其实也挺简单,上面我们也提到过,Activity和Fragment本身也是实现了LifecycleOwner接口,而DefaultLifecycleObserver的那些方法都只有一个参数DefaultLifecycleObserver,我们可以直接去获取owner的名字:

package com.example.jetpackdemo.lifecycle;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;

public class SimpleLifecycle implements DefaultLifecycleObserver {
    private static final String TAG = "SimpleLifecycle";

    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onCreate(owner);
        Log.d(TAG, "onCreate:" + owner.getClass().getSimpleName());
    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStart(owner);
        Log.d(TAG, "onStart:" + owner.getClass().getSimpleName());
    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onResume(owner);
        Log.d(TAG, "onResume:" + owner.getClass().getSimpleName());
    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onPause(owner);
        Log.d(TAG, "onPause:" + owner.getClass().getSimpleName());
    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStop(owner);
        Log.d(TAG, "onStop:" + owner.getClass().getSimpleName());
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onDestroy(owner);
        Log.d(TAG, "onDestroy:" + owner.getClass().getSimpleName());
    }
}

    再来看下Log:

     OK,这样看着就比较舒服了,我们可以清楚的看到:从启动MainActivity,再打开SecondActivity的整个生命周期的流程。

    本篇总结了对Lifecycle的基本使用,也在此基础上稍微扩展了一下,如何实现对多个activity生命周期的监听,以及如何区分具体的Activity,相信大家也对Lifecycle的使用有了一些了解。如果大家觉得还不错,也希望可以点个赞支持下。

猜你喜欢

转载自blog.csdn.net/qq_21154101/article/details/128250512