无法在 WorkManager 中设置自定义工作工厂
Unable to set a custom worker factory in WorkManager
我使用这段代码来设置我自己的工人工厂:
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
执行此代码后,我可以获得 WorkManager 实例:
val workManager = WorkManager.getInstance()
问题是,对于此后创建的每个工人,我的工厂从未被使用过。改为使用默认工厂。
我可以在 API 文档中看到方法 "WorkManager.initialize" 有一个注释:
Disable androidx.work.impl.WorkManagerInitializer in your manifest
我找不到有关如何执行此操作的任何信息。这是在一些旧版本的 WorkManager 上,他们忘记从文档中删除,还是这真的有必要?如果是,怎么做?
来自 WorkerManager.initialize()
的文档
By default, this method should not be called because WorkManager
is
automatically initialized. To initialize WorkManager
yourself, please
follow these steps:
Disable androidx.work.impl.WorkManagerInitializer
in your manifest In
Application#onCreate
or a ContentProvider
, call this method before
calling 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
class 中初始化您的 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
将添加名为 WorkerManagerInitializer
的 ContentProvider
,权限设置为 my-packagename.workermanager-init
。
如果您在禁用 WorkerManagerInitializer
时在清单文件中传递了错误的权限,Android 将无法编译您的清单。
我使用这段代码来设置我自己的工人工厂:
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
执行此代码后,我可以获得 WorkManager 实例:
val workManager = WorkManager.getInstance()
问题是,对于此后创建的每个工人,我的工厂从未被使用过。改为使用默认工厂。
我可以在 API 文档中看到方法 "WorkManager.initialize" 有一个注释:
Disable androidx.work.impl.WorkManagerInitializer in your manifest
我找不到有关如何执行此操作的任何信息。这是在一些旧版本的 WorkManager 上,他们忘记从文档中删除,还是这真的有必要?如果是,怎么做?
来自 WorkerManager.initialize()
By default, this method should not be called because
WorkManager
is automatically initialized. To initializeWorkManager
yourself, please follow these steps:Disable
androidx.work.impl.WorkManagerInitializer
in your manifest InApplication#onCreate
or aContentProvider
, call this method before callinggetInstance()
所以您需要在清单文件中禁用 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
class 中初始化您的 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
将添加名为 WorkerManagerInitializer
的 ContentProvider
,权限设置为 my-packagename.workermanager-init
。
如果您在禁用 WorkerManagerInitializer
时在清单文件中传递了错误的权限,Android 将无法编译您的清单。