我使用以下代码来设置自己的工人工厂:
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
执行此代码后,我可以获得WorkManager实例:
val workManager = WorkManager.getInstance()
问题在于,在此之后创建的每个工作人员都不会使用我的工厂。而是使用默认工厂。
我可以在API文档中看到方法“ WorkManager.initialize”具有注释:
在清单中禁用androidx.work.impl.WorkManagerInitializer
我找不到有关如何执行此操作的任何信息。这是在某些较旧版本的WorkManager上,他们忘记从文档中删除还是真的有必要吗?如果可以,怎么办?
答案 0 :(得分:8)
摘自size_t
默认情况下,不应调用此方法,因为
WorkerManager.initialize()
是 自动初始化。要自己初始化WorkManager
,请 请按照以下步骤操作:在清单中禁用
WorkManager
androidx.work.impl.WorkManagerInitializer
或Application#onCreate
,请在调用此方法之前 呼叫ContentProvider
因此,您需要在清单文件中禁用getInstance()
:
WorkManagerInitializer
然后在您的自定义 <application
//...
android:name=".MyApplication">
//...
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="your-packagename.workmanager-init"
android:enabled="false"
android:exported="false" />
</application>
类中,初始化Application
:
WorkerManager
注意:
默认情况下,class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
}
}
将添加一个名为WorkerManager
的{{1}},其权限设置为ContentProvider
。
如果您在禁用WorkerManagerInitializer
时在清单文件中传递了错误的权限,则Android将无法编译清单。