Невозможно установить пользовательскую фабрику рабочих в WorkManager

Я использую этот код для установки собственной фабрики рабочих:

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, и они забыли удалить из документации, или это действительно необходимо? Если так, то как?

1 ответ

Решение

Из документации 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 добавит ContentProvider называется WorkerManagerInitializer с властями, установленными на my-packagename.workermanager-init,

Если вы неправильно указали права доступа в файле манифеста при отключении WorkerManagerInitializerAndroid не сможет скомпилировать ваш манифест.

Другие вопросы по тегам