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

Rui*_*Rui 4 android android-workmanager

我使用此代码设置我自己的工厂工厂:

val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)

val configuration = Configuration.Builder()
        .setWorkerFactory(daggerWorkerFactory)
        .build()

WorkManager.initialize(context, configuration)
Run Code Online (Sandbox Code Playgroud)

执行此代码后,我可以获取WorkManager实例:

val workManager = WorkManager.getInstance()
Run Code Online (Sandbox Code Playgroud)

问题是,对于在此之后创建的每个工人,我的工厂从未使用过.而是使用默认工厂.

我可以在API文档中看到方法"WorkManager.initialize"有一个注释:

在清单中禁用androidx.work.impl.WorkManagerInitializer

我找不到任何有关如何执行此操作的信息.这是在一些旧版本的WorkManager上,他们忘了从文档中删除或这是否真的有必要?如果是这样,怎么样?

Sae*_*umi 9

从文档中 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>
Run Code Online (Sandbox Code Playgroud)

在您的自定义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)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:

默认情况下,WorkerManager将添加一个设置为权限的ContentProvider被调用WorkerManagerInitializermy-packagename.workermanager-init.

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

  • 就是这样!禁用清单中的提供程序更正了问题。感谢赛义德的宝贵帮助。我只是添加到您的答案中,为了编译代码,我需要将以下内容添加到提供程序中的 xml:tools:replace="android:authorities",否则将无法编译。 (2认同)
  • 看起来你实际上可以这样做:`android:authorities="${applicationId}.workmanager-init"` (2认同)