
2.3 使用LifecycleService解耦Service与组件
2.3.1 LifeCycIeService基本介绍
在上文中,我们介绍了如何利用LifeCycle来监听页面的生命周期,以达到解耦组件的目的。我们知道,拥有生命周期概念的组件除了Activity和Fragment,还有一个非常重要的组件是Service。为了便于对Service生命周期的监听,达到解耦Service与组件的目的,Android提供了一个名为LifecycleService的类。该类继承自Service,并实现了LifecycleOwner接口。与Activity/Fragment类似,它也提供了一个名为getLifecycle()的方法供我们使用。LifecycleService的源码如下所示。

2.3.2 LifecycIeService的具体使用方法
1.首先,我们需要在app的build.gradle文件中添加相关依赖。

2.添加依赖后,便可以使用LifecycleService类了。创建一个名为MyService的类,并让它继承自LifecycleService。由于LifecycleService是Service的直接子类,所以使用起来与普通Service没有差别。

3.接下来是MyServiceObserver类,该类需要实现LifecycleObserver接口。与此同时,使用@OnLifecycleEvent标签对那些你希望能够在Service生命周期发生变化时得到同步调用的方法进行标识。

4.最后,在页面中利用两个Button,控制Service的启动和停止,以测试我们的代码。

5.通过LogCat中的日志可以看到,随着Service生命周期的变化,MyServiceObserver中带有@OnLifecycleEvent标签的方法被自动调用了。这样,我们便实现了组件对Service生命周期的监听。

通过以上示例可以看出,当Service的生命周期发生变化时,不再需要主动对组件进行通知,组件能够在其内部自行管理好生命周期所带来的变化。LifecycleService很好地实现了组件与Service之间的解耦。