Android的Autoservice的使用以及隐藏的天坑
一.使用流程
- 添加依赖
在你的Android项目中添加以下依赖:
dependencies {
implementation ‘com.google.auto.service:auto-service:1.0-rc7’
annotationProcessor ‘com.google.auto.service:auto-service:1.0-rc7’
}
- 创建下沉服务接口
创建一个服务接口,例如:
interface IService {
fun test()
}
- 创建服务实现
创建一个服务实现,例如:
@AutoService(IService::class)
class WebViewServiceImpl : IWebViewService {
override funtest() {
// TODO
dosomething()
}
}
(这里隐藏一个天坑,后文给解决)
- 服务实现
object ServiceLoad {
fun <S> load(service: Class<S>?): S? {
val iterator = ServiceLoader.load(service).iterator()
return try {
if (iterator.hasNext()) {
iterator.next()
} else {
null
}
} catch (e: Exception) {
null
}
}
}
注意,这里使用ServiceLoader.load(MyService.class)来加载MyService的所有实现,然后遍历这些实现并调用它们的方法。
调用:
ServiceLoad.load(IWebViewService::class.java) ?.test(){}
二.天坑
在步骤3iterator.hasNext()一直返回null,解决方法如下:
在1步骤添加依赖中增加 kapt ‘com.google.auto.service:auto-service:1.0-rc6’,重新编译即可,kapt就相当于annotationProcessor ;
或者直接将服务接口的实现类改成java实现。