可观察生命周期的Service:lifecycle-service库了解一下

1,487 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

本篇文章主要是讲解lifecycle-service库,其实现了对于Service生命周期的观察,支持外部传入观察者监听Service生命周期。

对于下面的库大家应该熟悉:

implementation("androidx.lifecycle:lifecycle-process:2.5.0")

我们平常会使用这个库来观察Application整体的生命周期,比如监听应用的前后台切换,而lifecycle-service也是实现这样的效果的,只不过其监听的对象为Service,接下来我们来细细分析。

如果大家熟悉Activitylifecycle监听界面生命周期的实现原来,相信对这块的理解也同样将会驾轻就熟,因为这里的实现原理和Activitylifecycle监听原来都是差不多的。

自定义Service并额外实现LifecycleOwner接口

实现LifecycleOwner接口表示自己有提供生命周期观察的能力,也就实现了将Service改造成可被观察生命周期的对象:

public class LifecycleService extends Service implements LifecycleOwner {

    @Override
    @NonNull
    public Lifecycle getLifecycle() {
        return mDispatcher.getLifecycle();
    }
}

需要重新方法getLifecycle(),返回一个Lifecycle类,而lifecycle中实现Lifecycle类的只有一个类LifecycleRegistry,所以这里mDispatcher.getLifecycle()返回的也是一个LifecycleRegistry实例对象。

LifecycleRegistry就是负责帮助我们管理生命周期观察者对象的注册和反注册,以及分发生命周期等等。

引入ServiceLifecycleDispatcher封装LifecycleRegistry

LifecycleService中并没有直接使用LifecycleRegistry,而是额外定义了一个类ServiceLifecycleDispatcher包装LifecycleRegistry,实现Service生命周期的分发。

image.png

创建LifecycleRegistry就在其构造方法中实现的:

image.png

Service生命周期发生变化时,就会通知ServiceLifecycleDispatcher类对象的方法,这里我们看下完整的LifecycleService源码:

public class LifecycleService extends Service implements LifecycleOwner {

    private final ServiceLifecycleDispatcher mDispatcher = new ServiceLifecycleDispatcher(this);

    @Override
    public void onCreate() {
        mDispatcher.onServicePreSuperOnCreate();
        super.onCreate();
    }

    @Override
    public IBinder onBind(@NonNull Intent intent) {
        mDispatcher.onServicePreSuperOnBind();
        return null;
    }

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        mDispatcher.onServicePreSuperOnStart();
        super.onStart(intent, startId);
    }

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

    @Override
    public void onDestroy() {
        mDispatcher.onServicePreSuperOnDestroy();
        super.onDestroy();
    }
   //...
}

可以看到,当Service生命周期onCreate()执行了,就会调用ServiceLifecycleDispatcher的方法onServicePreSuperOnCreate(),其他的生命周期执行也会回调ServiceLifecycleDispatcher中对应的方法,自己看吧。

接下来我们看下ServiceLifecycleDispatcher的源码,这里以onServicePreSuperOnCreate()进行讲解:

public void onServicePreSuperOnCreate() {
    postDispatchRunnable(Lifecycle.Event.ON_CREATE);
}

调用postDispatchRunnable()并传递了Lifecycle.Event.ON_CREATE标识当前Service生命周期状态,继续往下看:

private void postDispatchRunnable(Lifecycle.Event event) {
    if (mLastDispatchRunnable != null) {
        mLastDispatchRunnable.run();
    }
    mLastDispatchRunnable = new DispatchRunnable(mRegistry, event);
    mHandler.postAtFrontOfQueue(mLastDispatchRunnable);
}

DispatchRunnable是个Runnable对象,通过Handler发送消息,最终会调用其run()方法实现真正的生命周期分发:

image.png

最终就会调用LifecycleRegistry.handleLifecycleEvent()实现真正的生命周期状态分发。这里为了防止同一个生命周期重复分发,使用了mWasExecuted标识控制。

这里顺便提下发送这个DispatchRunnable消息使用的是Handler的postAtFrontOfQueue()方法:

这个方法我在之前的Handler系列文章中有讲过,使用了这个方法会将消息添加到消息队列的队头,提高消息执行的优先级。

到这里我们就完成了整个lifecycle-service整体源码的分析。

基本使用

  1. 自定义Service并继承LifecycleService对象
class CustomService: LifecycleService() {

    //根据需要实现Service相应的生命周期方法
    override fun onCreate() {
        super.onCreate()
    }
}
  1. 添加观察者观察Service生命周期
fun test(service: CustomService) {
    service.lifecycle.addObserver(object : DefaultLifecycleObserver {
        override fun onCreate(owner: LifecycleOwner) {
            super.onCreate(owner)
        }
        //根据需要重写相应的生命周期方法
        override fun onDestroy(owner: LifecycleOwner) {
            super.onDestroy(owner)
        }
    })
}

总结

本篇文章主要是分析lifecycle-service实现原理,核心就是实现了LifecycleOwner接口,并使用ServiceLifecycleDispatcher包装LifecycleRegistry实现生命周期分发。希望本篇文章对你有所帮助。