根据指南提供的教程并不能有效的完成WorkMnanger的注入,因此记录本文。
指南地址:Hilt 和 Jetpack 集成 | Android 开发者 | Android Developers
1:引入依赖库
implementation 'androidx.hilt:hilt-work:1.0.0'
kapt 'androidx.hilt:hilt-compiler:1.0.0'
2:创建Work
这里使用了@AssistedInject @Assisted执行辅助注入,同时这里增加了一个参数g,该参数需要外部提供注入实例。常见的需求包括注入Retrifit2的ApiService实例,数据库Room的Dao实例,数据仓库实例。
@HiltWorker
class HomeWork @AssistedInject constructor(
@Assisted context: Context,
@Assisted parameters: WorkerParameters,
private val g: Gson
) : Worker(context, parameters) {
override fun doWork(): Result {
val data = g.fromJson("{}", JsonObject::class.java)
Log.e("nil", "Home Work ==> $data")
return Result.success()
}
}
3:编写独立的Factory
由于依赖包已经提供了HiltWorkerFactory类,因此不需要额外编写工厂实例。
4:在AndroidManifest.xml的application节点中注册WorkManager
这一步是必须的,官方教程未展示这一步导致,无法执行实例。
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
5:在Application中实现工厂模式初始化。
直接使用依赖包提供的HiltWorkerFactory,用于生成实例。
@HiltAndroidApp
class MainApp : Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
}
6:调用Work
测试样例使用OneTimeWorkRequest,具体的请求类型自行定义。
WorkManager.getInstance(this).enqueue(OneTimeWorkRequest.from(HomeWork::class.java))