持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
本篇文章主要是讲解
lifecycle-service库,其实现了对于Service生命周期的观察,支持外部传入观察者监听Service生命周期。
对于下面的库大家应该熟悉:
implementation("androidx.lifecycle:lifecycle-process:2.5.0")
我们平常会使用这个库来观察Application整体的生命周期,比如监听应用的前后台切换,而lifecycle-service也是实现这样的效果的,只不过其监听的对象为Service,接下来我们来细细分析。
如果大家熟悉Activity中lifecycle监听界面生命周期的实现原来,相信对这块的理解也同样将会驾轻就熟,因为这里的实现原理和Activity的lifecycle监听原来都是差不多的。
自定义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生命周期的分发。
创建LifecycleRegistry就在其构造方法中实现的:
当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()方法实现真正的生命周期分发:
最终就会调用LifecycleRegistry.handleLifecycleEvent()实现真正的生命周期状态分发。这里为了防止同一个生命周期重复分发,使用了mWasExecuted标识控制。
这里顺便提下发送这个DispatchRunnable消息使用的是Handler的postAtFrontOfQueue()方法:
这个方法我在之前的Handler系列文章中有讲过,使用了这个方法会将消息添加到消息队列的队头,提高消息执行的优先级。
到这里我们就完成了整个lifecycle-service整体源码的分析。
基本使用
- 自定义
Service并继承LifecycleService对象
class CustomService: LifecycleService() {
//根据需要实现Service相应的生命周期方法
override fun onCreate() {
super.onCreate()
}
}
- 添加观察者观察
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实现生命周期分发。希望本篇文章对你有所帮助。