无法在 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 将添加名为 WorkerManagerInitializerContentProvider,权限设置为 my-packagename.workermanager-init

如果您在禁用 WorkerManagerInitializer 时在清单文件中传递了错误的权限,Android 将无法编译您的清单。