WorkManager v2.1 представил класс DelegatingWorkerFactory
, который может помочь в этих случаях.
Требуется, чтобы разработчик приложения реализовал его правильно, как вы сказали, WorkManagerявляется одноэлементным.
Ключевым моментом является то, что, если приложение требует пользовательской инициализации и пользовательского WorkerFactory, оно должно использовать DelegatingWorkerFactory
, а затем добавить свой собственный WorkerFactory.
Ключевым моментом здесь является то, что WorkerFactory приложения должен проверить имя рабочего класса, чтобы убедиться, что оно правильное (обычно вставляя некоторые параметры в конструктор). Если имя класса не соответствует ожидаемому приложением, оно может просто возвратить ноль, и DelegatingWorkerFactory
позаботится о том, чтобы найти правильный рабочий класс для создания экземпляра.
Что-то вроде (в коде приложения):
class MyWorkerFactory(
private val myInjectedParam: InjectedParam
) : WorkerFactory() {
override fun createWorker(
appContext: Context,
workerClassName: String,
workerParameters: WorkerParameters
): ListenableWorker? {
return when (workerClassName) {
MyWorker::class.java.name ->
MyWorker(appContext, workerParameters, myInjectedParam)
else ->
// Return null, so that the base class can delegate to the default WorkerFactory.
null
}
}
}
Затем приложению необходимо добавить этот WorkerFactory в DelegatingWorkerFactory, который он настроил как пользовательский WorkerFactory, используя:
private fun initializeWorkManager (myInjectedParam: MyInjectedParam): WorkManager
{
val appContext = getApplication<MyApplication>()
val factory = appContext.workManagerConfiguration.workerFactory
as DelegatingWorkerFactory
factory.addFactory(MyWorkerFactory(myInjectedParam))
return WorkManager.getInstance(appContext)
}
В то время как в классе приложения у вас есть:
class MainApplication : Application(), Configuration.Provider {
val delegatingWorkerFactory: DelegatingWorkerFactory
// Setup custom configuration for WorkManager with a DelegatingWorkerFactory
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.setWorkerFactory(delegatingWorkerFactory)
.build()
}
}