Jetpack架构组件库-Lifecycle应用解析之知其然

原文连接:https://mp.weixin.qq.com/s/vF4v5ELjM6qYzU-MlXHhWw

前言

==本次主要讲解的内容:==

1、Lifecycle介绍,解决了什么问题

2、Lifecycle理解与运用

3、Lifecycle如何感知生命周期的状态?

一、Jetpack 介绍

1、什么是Lifecycle

Lifecycle 是具备宿主生命周期感知能力的组件。

它能持有组件(如 Activity 或 Fragment)生命周期状态的信息,并且允许其他观察者监听宿主的状态。

它也是 Jetpack 组件库的的核心基础,包括我们就后面会讲到的 LiveData , ViewModel 组件等也都是基于它来实现的。

2、Lifecycle解决什么问题?

Android开发中的主要问题之一是生命周期管理问题。

换句话说,如果不能正确处理应用程序生命周期,可能会导致一些问题,如内存泄漏和一些崩溃。

生命周期感知组件作为 Android 体系结构组件的一部分,可根据其他组件(如 Activity 或 Fragment)生命周期状态的变化完成任务。

因此,这些组件可帮助您创建组织更好的代码,并且通常重量更轻的代码更易于维护和测试。

一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。但是,这种模式会导致代码条理性很差而且会扩散错误。

比如,我们通过Activity在屏幕上显示当前的定位,通常会做如下实现:

    class MyLocationListener {
        public MyLocationListener(Context context, Callback callback) {
            // ...
        }

        void start() {
            // 开启定位服务
        }

        void stop() {
            // 断开定位服务
        }
    }

    class MyActivity extends AppCompatActivity {
        private MyLocationListener myLocationListener;

        @Override
        public void onCreate(...) {
            myLocationListener = new MyL ocationListener(this, (location) -> {
                // update UI
            });
        }

        @Override
        public void onStart() {
            super.onStart();
            myLocationListener.start();
            //管理其他组件需要响应Activity生命周期
        }

        @Override
        public void onStop() {
            super.onStop();
            myLocationListener.stop();
            // 管理其他组件需要响应Activity生命周期
        }
    }
    

示例看起来没问题,但在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。

此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。

二、Lifecycle理解与运用

Lifecycle用法:

Lifecycle 有三种写法,接下来介绍它的写法:

使用 Lifecycle 前需要先添加依赖:

 //如果想单独使用,可引入下面这个依赖
api 'androidx.lifecycle:lifecycle-common:2.1.0'

以上面通过Activity在屏幕上显示当前的定位位列

1、LifecycleObserver 配合注解用法:

//1. 自定义的LifecycleObserver观察者,在对应方法上用注解声明想要观  察的宿主的生命周期事件即可
class LocationObserver extends LifecycleObserver{
    //宿主执行了onstart时,会分发该事件
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart(@NotNull LifecycleOwner owner){
      //开启定位
    }
  
  //宿主执行了onstop时 会分发该事件
  @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
  void onStop(@NotNull LifecycleOwner owner){
     //停止定位
  }
 }

//2. 注册观察者,观察宿主生命周期状态变化
class MyActivity extends AppCompatActivity{
  public void onCreate(...){
    LocationObserver observer =new LocationObserver()
    //应该在Activity的 onCreate() 方法中添加此行代码,以便通过使用  getLifecycle().addObserver() 将生命周期所有者Activity与LocationObserver关联。
    getLifecycle().addObserver(observer);
  }
 }

2、通过集成FullLifecyclerObserver 拥有宿主所有生命周期事件用法:

//1.查看FullLifecycleObserver源码
interface FullLifecycleObserver extends LifecycleObserver {

    void onCreate(LifecycleOwner owner);

    void onStart(LifecycleOwner owner);

    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);

    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}

//2.用法,复写需要监听的方法
class LocationObserver implements FullLifecycleObserver{
    void onStart(LifecycleOwner owner){
         //开启定位
    }
    void onStop(LifecycleOwner owner){
        //停止定位
    }
}

//3. 注册观察者,观察宿主生命周期状态变化
class MyActivity extends AppCompatActivity{
  public void onCreate(...){
    LocationObserver observer =new LocationObserver()
    //应该在Activity的 onCreate() 方法中添加此行代码,以便通过使用  getLifecycle().addObserver() 将生命周期所有者Activity与LocationObserver关联。
    getLifecycle().addObserver(observer);
  }
 }

3、通过LifecycleEventObserver宿主生命周期事件封装成 Lifecycle.Event的用法:

//1、LifecycleEventObserver源码
public interface LifecycleEventObserver extends LifecycleObserver {
    /**
     * Called when a state transition event happens.
     *
     * @param source The source of the event
     * @param event The event
     */
    void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}

//2.用法 
class LocationObserver extends LifecycleEventObserver{
    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        //需要自行判断life-event是onstart, 还是onstop
       if(event == Lifecycle.Event.ON_START){
            //开启定位
        }else  if (event == Lifecycle.Event.ON_STOP) {
           //停止定位
       }
    }
}

//3. 注册观察者,观察宿主生命周期状态变化
class MyActivity extends AppCompatActivity{
  public void onCreate(...){
    LocationObserver observer =new LocationObserver()
    //应该在Activity的 onCreate() 方法中添加此行代码,以便通过使用  getLifecycle().addObserver() 将生命周期所有者Activity与LocationObserver关联。
    getLifecycle().addObserver(observer);
  }
 }

三、Lifecycle如何感知生命周期的状态?

我们知道了Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

我们先复习一下Activity&Fragment的生命周期方法:

1、Activity 生命周期:

onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。当 Activity 进入新状态时,系统会调用其中每个回调。

Jetpack架构组件库-Lifecycle应用解析之知其然_第1张图片

Activity A 启动 Activity B 时的操作发生顺序:

1、Activity A 的 onPause() 方法执行。

2、Activity B 的 onCreate()、onStart() 和 onResume() 方法依次执行(Activity B 现在具有用户焦点)。

3、然后,如果 Activity A 在屏幕上不再显示,其 onStop() 方法执行。

2、Fragment生命周期

Fragment和Activity还不同,它不属于四大组件范畴,但是它必须依托于Activity,其生命周期直接受宿主 Activity 生命周期的影响,

当 Activity 暂停时,Activity 的所有Fragment也会暂停;当 Activity 被销毁时,所有Fragment也会被销毁。不过,当 Activity 正在运行(处于已恢复生命周期状态)时,您可以独立操纵每个Fragment,如添加或移除Fragment。

当其 Activity 运行时,Fragment的生命周期如下:

Jetpack架构组件库-Lifecycle应用解析之知其然_第2张图片

管理Fragment生命周期与管理 Activity 生命周期很相似。和 Activity 一样,片段也以三种状态存在:

已恢复

Fragment在运行中的 Activity 中可见。

已暂停

另一个 Activity 位于前台并具有焦点,但此片段所在的 Activity 仍然可见(前台 Activity 部分透明,或未覆盖整个屏幕)。

已停止

片段不可见。宿主 Activity 已停止,或片段已从 Activity 中移除,但已添加到返回栈。已停止的片段仍处于活动状态(系统会保留所有状态和成员信息)。不过,它对用户不再可见,并随 Activity 的终止而终止。

如下图:Activity生命周期对应的Fragment的生命周期

Jetpack架构组件库-Lifecycle应用解析之知其然_第3张图片

Fragment所在 Activity 的生命周期会直接影响Fragment段的生命周期,其表现为,Activity 的每次生命周期回调都会引发每个Fragment的类似回调。例如,当 Activity 收到 onPause() 时,Activity 中的每个Fragment也会收到 onPause()。

Fragment还有几个额外的生命周期回调,用于处理与 Activity 的唯一交互,从而执行构建和销毁Fragment界面等操作。这些额外的回调方法是:

  • [x] onAttach()

在片段已与 Activity 关联时进行调用(Activity 传递到此方法内)。

  • [x] onCreateView()

调用它可创建与片段关联的视图层次结构。

  • [x] onActivityCreated()

当 Activity 的 onCreate() 方法已返回时进行调用。

  • [x] onDestroyView()

在移除与片段关联的视图层次结构时进行调用。

  • [x] onDetach()

在取消片段与 Activity 的关联时进行调用。

3、Lifecycle如何感知生命周期的状态?

Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:

事件

从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件。

状态

由 Lifecycle 对象跟踪的组件的当前状态。

构成 Android Activity 生命周期的状态和事件如下:

Jetpack架构组件库-Lifecycle应用解析之知其然_第4张图片

宿主生命周期与宿主状态的对应关系分别为:onCreate-Created、onStart-Started、onResume-Resumed、onpause-Started、onStop-Created、onDestroy-Destroyed

当生命周期所有者的状态发生更改时,分配的生命周期对象将更新为新状态。在任何给定时间,生命周期所有者将处于以下五种状态之一:

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

当组件通过不同状态转换时,生命周期对象将在已添加到列表中的任何观察器上触发事件。以下事件可用于在生命周期观察者中实现:

  • Lifecycle.Event.ON_CREATE
  • Lifecycle.Event.ON_START
  • Lifecycle.Event.ON_RESUME
  • Lifecycle.Event.ON_PAUSE
  • Lifecycle.Event.ON_STOP
  • Lifecycle.Event.ON_DESTROY
  • Lifecycle.Event.ON_ANY

添加 observer 时,完整的生命周期事件分发

如下图,生命周期所有者的状态更改顺序以及将在每个状态转换之间在观察者上触发的生命周期事件:

Jetpack架构组件库-Lifecycle应用解析之知其然_第5张图片

< END >

【Android进化之路】
image

微信扫描二维码,关注我的公众号。

你可能感兴趣的:(android,jetpack,lifecycle)