首页 > 其他分享 >JetPack之Lifecycle

JetPack之Lifecycle

时间:2024-03-20 21:33:04浏览次数:18  
标签:JetPack void DefaultLifecycleObserver 观察者 接口 Lifecycle owner public

目录


一、简介

1. Lifecycle是什么?

JetPack.Lifecycle是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service、ViewModel 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。

Lifecycle的重要细节

Lifecycle可以有效地避免内存泄漏和解决安卓生命周期的常见难题
Lifecycle 是一个表示安卓生命周期及状态的对象
LifecycleOwner用于连接有生命周期的对象,如Activity、Fragment
LifecycleObserver用于观察LifecycleOwner
Lifecycle 框架使用观察者设计模式实现观察者监听被观察者的生命周期的变化

LifeCycle 的出现主要是为了解决: 系统组件的生命周期与普通组件之间的耦合性。
系统组件指:Activity/Fragment、Service 和 Application。
普通组件指:将代码按照功能或者作用封装成的组件。

Lifecycle逻辑流程
在这里插入图片描述

2. Lifecycle使用

Jetpack 为我们提供了两个接口:
被观察者:LifecycleOwner
观察者:LifecycleObserver
被监听的系统组件需要去实现 LifecycleOwner 接口,观察者需要实现 LifecycleObserver 接口。
在这里插入图片描述

2.1 实现LifecycleObserver接口

导入此依赖,或者androidx系列。

    //lifecycle依赖
    implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
    implementation "androidx.lifecycle:lifecycle-service:2.2.0"
    implementation "androidx.lifecycle:lifecycle-process:2.2.0"
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.2.0"

LifeCycleActivity(被观察者)

public class LifeCycleActivity extends AppCompatActivity {

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

观察者实现LifecycleObserver 接口,监听方法上添加与之对应的生命周期注解
@OnLifecycleEvent(Lifecycle.Event.xxxxxxx)

MyObserver(观察者)

public class MyObserver implements LifecycleObserver {
    String Tag = "Henry";

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

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)//可见连接
    public void connectListener() {
        Log.d(Tag, "connectListener-----------run");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)//不可见断开连接
    public void disconnectListener() {
        Log.d(Tag, "disconnectListener-----------run");
    }

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

是不是很简单?我们运行测试一下:Perfect!
在这里插入图片描述

2.2 实现DefaultLifecycleObserver接口

DefaultLifecycleObserver是对LifecycleObserver的二次封装,为了用户更方便使用
在这里插入图片描述

上面的 @OnLifecycleEventxxxx 注解还得用户自己手写,使用DefaultLifecycleObserver我们便可以直接像在Activity、Fragment里调用它的生命周期一样,还会自动提示,非常方便。
在这里插入图片描述
不仅仅使用方便,注意到方法中的LifecycleOwner了吗? 后期我们还可以在方法中获取到这个被观察者。
MyObserver2 (观察者)

public class MyObserver2 implements DefaultLifecycleObserver {
    //DefaultLifecycleObserver是对LifecycleObserver的二次封装,为了用户好用
    String Tag = "Henry";

    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onCreate(owner);
        Log.d(Tag, "DefaultLifecycleObserver--------onCreate");
    }

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

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

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

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

添加方式不变,我们add进去,此时LifeCycleActivity已经拥有了两个观察者------MyObserver1和MyObserver2 。
LifeCycleActivity (被观察者)

public class LifeCycleActivity extends AppCompatActivity {

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

}

运行测试一下:两个观察者都能监听到Activity的生命周期。
在这里插入图片描述

2.3 实现LifecycleEventObserver接口

通过实现 LifecycleEventObserver 接口,重写 onStateChanged 方法,在该方法内部判断 Lifecycle.Event 来实现具体的业务逻辑

public class MyObserver4 implements LifecycleEventObserver {
    String Tag = "Henry";

    @Override
    public void onStateChanged(@NonNull LifecycleOwner lifecycleOwner, @NonNull Lifecycle.Event event) {
        switch (event) {
            case ON_CREATE:
                Log.d(Tag, "initVideo");
                break;
            case ON_START:
                Log.d(Tag, "startPlay");
                break;
            case ON_RESUME:
                Log.d(Tag, "resumePlay");
                break;
            default:
                break;
        }
    }
}
public class LifeCycleActivity extends AppCompatActivity {
    IPresenter mypresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);
//        getLifecycle().addObserver(new MyObserver());
//        getLifecycle().addObserver((new MyObserver2()));
//        getLifecycle().addObserver((new MyObserver3()));
        getLifecycle().addObserver((new MyObserver4()));
        ................

测试一下:
在这里插入图片描述

3. 使用技巧

3.1 内部类观察者

MyObserver3 是 LifeCycleActivity 的内部类观察者,它实现了 DefaultLifecycleObserver 接口,对生命周期变化进行观察并在相应的生命周期事件中输出日志。

public class LifeCycleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);
        getLifecycle().addObserver(new MyObserver());
        getLifecycle().addObserver((new MyObserver2()));
        getLifecycle().addObserver((new MyObserver3()));
    }

    public class MyObserver3 implements DefaultLifecycleObserver {
        //DefaultLifecycleObserver是对LifecycleObserver的二次封装,为了用户好用
        String Tag = "Henry";

        @Override
        public void onCreate(@NonNull LifecycleOwner owner) {
            DefaultLifecycleObserver.super.onCreate(owner);
            Log.d(Tag, "DefaultLifecycleObserver--------onCreate");
        }

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

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

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

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

}

使用内部类观察者的好处包括:

  • 封装性:将观察者类定义为外部类的内部类,可以更好地组织代码结构,将相关的类放在一起,提高代码的可读性和可维护性。
  • 访问权限:内部类可以访问外部类的成员变量和方法,可以方便地获取外部类的状态或调用外部类的方法,从而更容易实现观察者与被观察者之间的交互。
  • 代码复用:内部类可以直接访问外部类的成员,避免了在不同类之间传递参数的复杂性,提高了代码的复用性。
  • 逻辑关联:将观察者类定义为内部类可以更好地表达观察者与被观察者之间的逻辑关联,代码结构更加清晰。

3.2 观察者接口

IPresenter 接口继承了 DefaultLifecycleObserver 接口,而 MyPresenter 类实现了 IPresenter 接口。然后在 Activity 中创建了 MyPresenter 实例,并通过 addObserver 方法将其添加为生命周期观察者。

接口IPresenter 实现DefaultLifecycleObserver

public interface IPresenter extends DefaultLifecycleObserver {

    @Override
    default void onStart(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStart(owner);
    }

    @Override
    default void onStop(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStop(owner);
    }
}

MyPresenter 实现IPresenter 接口,重写方法

public class MyPresenter implements IPresenter {

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        IPresenter.super.onStart(owner);

    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {
        IPresenter.super.onStop(owner);

    }

}

LifeCycleActivity 如果有多个观察者实现IPresenter接口,可以通过IPresenter接口+工厂模式实例化 具体观察者再注册监听。

public class LifeCycleActivity extends AppCompatActivity {
    IPresenter mypresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);
        getLifecycle().addObserver(new MyObserver());
        getLifecycle().addObserver((new MyObserver2()));
        getLifecycle().addObserver((new MyObserver3()));

        mypresenter=new MyPresenter();
        //多个接口 + 工厂设计模式
        getLifecycle().addObserver(mypresenter);
        
    }
   }

这种接口观察者的设计有以下好处:

  • 解耦:通过接口观察者模式,MyPresenter 类只需要实现 IPresenter 接口定义的方法,而不需要直接继承 DefaultLifecycleObserver,从而实现了观察者和被观察者的解耦。这样,在需要改变观察者实现的情况下,只需要修改实现了 IPresenter 接口的类,而不需要修改 DefaultLifecycleObserver 的实现。
  • 灵活性:接口观察者模式使得一个类可以同时实现多个接口,从而可以观察多个不同的生命周期事件。这种灵活性可以让不同的观察者类实现不同的接口,实现更加细粒度的生命周期管理。
  • 遵循设计原则:接口观察者模式符合面向接口编程的设计原则,使得代码更加灵活、可扩展和易于维护。
  • 工厂设计模式:通过工厂设计模式创建具体的观察者实例,可以更好地隐藏对象的创建细节,提高代码的可读性和可维护性。

参考链接:
Jetpack 之 LifeCycle 组件使用详解
Lifecycle 使用与源码分析——彻底搞懂Lifecycle原理

标签:JetPack,void,DefaultLifecycleObserver,观察者,接口,Lifecycle,owner,public
From: https://blog.csdn.net/qq_45649553/article/details/136852134

相关文章

  • eclipse 问题之一:Plugin execution not covered by lifecycle configuration
    1、问题eclipse作为java工程的开发工具,可以集成maven直接管理maven工程。但是对于maven工程中描述的插件,有时候eclipse会报如下错误(示例:Pluginexecutionnotcoveredbylifecycleconfiguration:org.codehaus.mojo:exec-maven-plugin:3.1.1:java(execution:default......
  • VMware Aria Suite Lifecycle 8.16 - 应用生命周期管理
    VMwareAriaSuiteLifecycle8.16-应用生命周期管理请访问原文链接:https://sysin.org/blog/vmware-aria-suite-lifecycle/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org应用生命周期管理VMwareAriaSuiteLifecycle(以前称为vRealizeSuiteLifecycleManage......
  • VMware vRealize Suite Lifecycle Manager 8.6 下载 - vRealize Suite 生命周期和内容
    使用vRealizeSuiteLifecycleManager管理vRealizeSuitevRealizeSuiteLifecycleManager针对vRealizeSuite产品提供完整的生命周期和内容管理功能。它通过自动执行部署、升级和配置来帮助客户缩短价值实现时间,同时将DevOps原则应用到vRealizeSuite内容管理中。vRea......
  • VMware vRealize Suite Lifecycle Manager 8.4 发布 - vRealize Suite 生命周期和内容
    使用vRealizeSuiteLifecycleManager管理vRealizeSuitevRealizeSuiteLifecycleManager针对vRealizeSuite产品提供完整的生命周期和内容管理功能。它通过自动执行部署、升级和配置来帮助客户缩短价值实现时间,同时将DevOps原则应用到vRealizeSuite内容管理中。vRea......
  • VMware Aria Suite Lifecycle 8.12 - 应用生命周期管理
    VMwareAriaSuiteLifecycle8.12-应用生命周期管理作者主页:sysin.org应用生命周期管理VMwareAriaSuiteLifecycle(以前称为vRealizeSuiteLifecycleManager)通过全面的应用生命周期和内容管理解决方案最大限度减少日常管理工作并提高终端用户的工作效率。全面的生命周期管理......
  • 如何在 WindowManager.addView 中使用 Jetpack Compose
    如何在WindowManager.addView中使用JetpackCompose一、引出问题Android开发中,很常见的一个场景,通过WindowManager.addView()添加一个View到屏幕上。Android最新的视图框架JetpackCompose,如何应用进来。这个被添加的View如何使用Compose编写视图呢?二、探究问题......
  • SmartLifecycle 使用介绍
    参考https://blog.csdn.net/feiying0canglang/article/details/127156520importorg.springframework.context.SmartLifecycle;importorg.springframework.stereotype.Component;@ComponentpublicclassMySmartLifecycleimplementsSmartLifecycle{privatevolat......
  • 如何看待Android的Jetpack这一系列库?
    如何看待Android的Jetpack这一系列库?随着移动领域的飞速发展,越来越多的工程师开始追求更高效率更便捷的开发模式,各种框架架构层出不穷,比如我们很熟悉的MVC、MVP、MVVM,而每种开发模式都有各自的优缺点,为了统一开发规范,Google推出了Jetpack。Jetpack是一个由多个库组成的套件,可帮助......
  • springboot启动报错[main] o.a.catalina.core.AprLifecycleListener
    详细信息为:---[main]o.a.catalina.core.AprLifecycleListener:Anincompatibleversion[1.2.17]oftheApacheTomcatNativelibraryisinstalled,whileTomcatrequiresversion[1.2.34]解决方法:下载对应版本的native文件,地址为https://archive.apache......
  • VMware Aria Suite Lifecycle 8.14 发布下载 - 应用生命周期管理
    VMwareAriaSuiteLifecycle8.14发布下载-应用生命周期管理请访问原文链接:https://sysin.org/blog/vmware-aria-suite-lifecycle/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org应用生命周期管理VMwareAriaSuiteLifecycle(以前称为vRealizeSuiteLifecyc......