Android_Jetpack学习之路二(Lifecycle组件)

文章介绍了如何使用AndroidJetpack中的LifeCycle组件来解耦Activity、Service与自定义组件,例如LocationService。通过实现LifecycleObserver接口并在特定生命周期方法上添加注解,自定义组件能自动响应Activity或Service的生命周期变化,从而简化代码并提高组件的复用性。
摘要由CSDN通过智能技术生成

Android_Jetpack学习之路二(LifeCycle组件)

LifeCycle组件

LifeCycle可以让我们自定义的类能主动感知到Activity、Fragment、Application、Service等系统组件的生命周期。
我们以百度定位为例,我们一般在Activity生命周期的oncreate回调函数里调用 自定义类LocationService的start()方法,在onStop回调里调用LocationService的stop() 方法来启动和停止定位服务。
那么,我们可不可以解开Activity生命周期函数与LocationService的耦合性能?
答案是,利用LifeCycle让LocationService作为观察者,能感知到Activity的声明周期,当acitivty执行到onCreate与onStop时,LocationService自动调用它内部的start()与stop()方法来启动和停止定位,而无需再在activity里写调用LocationService.start()与LocationService.stop的代码了。当然这里的被观察者自然就是acitivty了。
,当acitivty执行到onCreate与onStop时,LocationService自动调用它内部的start()与stop()方法来启动和停止定位。

使用LifeCycle解耦Activity与自定义组件

让自定义类(或者称作自定组件)实现LifecycleObserver,在要执行的函数start()和stop()上面添加注解@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)与 @OnLifecycleEvent(Lifecycle.Event.ON_STOP) 。

/**
 * 封装了定位的开启和停止
 */
public class LocationService implements LifecycleObserver {
    String TAG = getClass().getSimpleName();
    /**
     * 开始定位
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start(){
        Log.d(TAG,"location Service start...");
    }
    /**
     * 停止定位
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop(){
        Log.d(TAG,"location Service stop...");
    }

}

在一个Activity中new一个自定义类的对象实例,如LocationService类对象locationService.将getLifecycle().addObserver
locationService将观察者与被观察者绑定

        LocationService locationService = new LocationService();
        getLifecycle().addObserver(locationService);

运行项目,对这个Activity进行开启和结束操作就可以得到运行结果:

2023-03-09 11:18:53.622 6528-6528/com.lxs.lifecycle D/TestActivity: Activity onStart...
2023-03-09 11:18:53.622 6528-6528/com.lxs.lifecycle D/LocationService: location Service start...
2023-03-09 11:18:56.353 6528-6528/com.lxs.lifecycle D/LocationService: location Service stop...
2023-03-09 11:18:56.354 6528-6528/com.lxs.lifecycle D/TestActivity: Activity onStop...

LifeCycle中Event中分别对应了activity中的各个生命周期

    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }

我们可以发现使用Lifecycle提高了自定义组件的复用性,降低可以自定义组件与Activity等系统组件的耦合性,不需要在Activity的onStop()等方法中进行关闭操作等等。

使用LifeCycle解耦Service与自定义组件

关键步骤:build.gradle中引入依赖

implementation “androidx.lifecycle:lifecycle-extensions:2.2.0”
  1. Service处理
    让我们的Service继承于LifecycleService(LifecycleService实际上就是Service 实现LifecycleOwner接口)getLifecycle().addObserve()将观察者与被观察者绑定,即将自定义类与Service绑定。
    在这里插入图片描述
public class MyService extends LifecycleService {
    LocationService locationService;
    String TAG =getClass().getSimpleName();
    public MyService() {
        locationService = new LocationService();
        getLifecycle().addObserver(locationService);
    }
    @Override
    public void onCreate() {
        Log.i(TAG,"onCreate");
        super.onCreate();
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        Log.i(TAG,"onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.i(TAG,"onDestroy");
        super.onDestroy();
    }
}

自定义类实现LifecycleObserver接口,添加标签注解事件@OnLifecycleEvent,感知Service的声明周期。

public class LocationService implements LifecycleObserver {
    String TAG = getClass().getSimpleName();
    /**
     * 开始定位
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start(){
        Log.d(TAG,"location Service start...");
    }
    /**
     * 停止定位
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop(){
        Log.d(TAG,"location Service stop...");
    }

    /**
     * 停止定位: 用于感知Service的onDestroy声明周期
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void stopLoc()
    {
        Log.i(TAG,"location Service destroy...");
    }
}

启动和停止service可以得到运行结果:

2023-03-09 15:13:42.645 17116-17116/com.lxs.lifecycle I/MyService: onCreate
2023-03-09 15:13:42.646 17116-17116/com.lxs.lifecycle I/MyService: onStartCommand
2023-03-09 15:13:42.646 17116-17116/com.lxs.lifecycle D/LocationService: location Service start...
2023-03-09 15:13:44.574 17116-17116/com.lxs.lifecycle I/MyService: onDestroy
2023-03-09 15:13:44.574 17116-17116/com.lxs.lifecycle D/LocationService: location Service stop...
2023-03-09 15:13:44.575 17116-17116/com.lxs.lifecycle I/LocationService: location Service destroy...

Service销毁时会执行LifecycleService的onDestory(),会同事完成Lifecycle.Event.ON_STOP和Lifecycle.Event.ON_DESTROY两个事件(使用Runnable,所以上面运行结果中LocationService的stop和destroy会出现在MyService的onDestroy()后面)
在这里插入图片描述
在这里插入图片描述

使用ProcessLifecycleOwner感知Application

Lifecycle同样可以观察整个进程的生命周期,就是ProcessLifecycleOwner(即进程生命周期拥有者).
同样需要依赖:

implementation “androidx.lifecycle:lifecycle-extensions:2.2.0”

MyApplication 继承Application,ProcessLifecycleOwner.getLifecycle().addObserver()将观察者与被观察者绑定,即将自定义类ApplicationObserver与MyApplication绑定。

public class MyApplication extends Application {
    ApplicationObserver applicationObserver;

    @Override
    public void onCreate() {
        Log.d("MyApplication","MyApplication onCreate...");
        applicationObserver = new ApplicationObserver();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(applicationObserver);
        super.onCreate();
    }

}
  1. 自定义类ApplicationObserver实现LifecycleObserver接口,添加标签注解事件,感知Application的声明周期。
public class ApplicationObserver implements LifecycleObserver {
    String TAG = getClass().getSimpleName();

    /**
     * 整个应用程序只感知1次
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate()
    {
        Log.i(TAG,"ApplicationObserver onCreate...");
    }

    /**
     * 应用程序打到前台
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart()
    {
        Log.i(TAG,"ApplicationObserver onStart...");
    }

    /**
     * 应用程序打到前台
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume()
    {
        Log.i(TAG,"ApplicationObserver onResume...");
    }



    /**
     * 应用程序退到后台
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause()
    {
        Log.i(TAG,"ApplicationObserver onPause...");
    }

    /**
     * 应用程序退到后台
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop()
    {
        Log.i(TAG,"ApplicationObserver onStop...");
    }
    /**
     * 应用程序销毁,感知不到
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy()
    {
        Log.i(TAG,"ApplicationObserver onDestroy...");
    }
}

运行项目然后退出前台之后得到运行结果


2023-03-09 16:08:48.438 24071-24071/com.lxs.lifecycle D/MyApplication: MyApplication onCreate...
2023-03-09 16:08:48.441 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onCreate...
2023-03-09 16:08:48.555 24071-24071/com.lxs.lifecycle I/MainActivity: onCreate
2023-03-09 16:08:48.558 24071-24071/com.lxs.lifecycle I/MainActivity: onStart
2023-03-09 16:08:48.559 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onStart...
2023-03-09 16:08:48.561 24071-24071/com.lxs.lifecycle I/MainActivity: onResume
2023-03-09 16:08:48.564 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onResume...
2023-03-09 16:09:04.977 24071-24071/com.lxs.lifecycle I/MainActivity: onResume
2023-03-09 16:09:05.651 24071-24071/com.lxs.lifecycle I/MainActivity: onStop
2023-03-09 16:09:05.655 24071-24071/com.lxs.lifecycle I/MainActivity: onDestroy
2023-03-09 16:09:05.686 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onPause...
2023-03-09 16:09:05.686 24071-24071/com.lxs.lifecycle I/ApplicationObserver: ApplicationObserver onStop...

以上就是Lifecycle的基本用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值