无法在WorkManager中设置自定义工作器工厂

7
我使用这段代码来设置自己的工作线程工厂:
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上吗?他们是否忘记从文档中删除它或者这真的是必要的?如果是必要的,怎么做呢?

请参阅 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration。 - cambunctious
1个回答

13

根据 WorkerManager.initialize() 的文档:

默认情况下,不应调用此方法,因为 WorkManager 将自动初始化。要手动初始化 WorkManager,请按照以下步骤操作:

在你的清单文件中禁用 androidx.work.impl.WorkManagerInitializer,然后在 Application#onCreateContentProvider 中,在调用 getInstance() 之前调用此方法。

所以你需要做的是在 Manifest 文件中禁用 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 会添加一个名为 WorkerManagerInitializerContentProvider ,其权限设置为 my-packagename.workermanager-init

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


2
就是这样!在清单中禁用提供程序纠正了问题。感谢Saeed的宝贵帮助。我只是想补充一下你的答案,为了编译代码,我需要在提供程序的xml中添加以下内容:tools:replace="android:authorities",否则它将无法编译。 - Rui
2
看起来你实际上可以这样做:android:authorities="${applicationId}.workmanager-init" - Erik B
如何创建daggerWorkerFactory和toInjectInWorker对象? - Hung Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接