Android WorkManager不支持';当客户端调用WorkManager.initialize()时,无法在库中工作
我正在编写一个使用WorkManager的Android库。在代码的某个地方,我称之为这样的东西:Android WorkManager不支持';当客户端调用WorkManager.initialize()时,无法在库中工作,android,android-workmanager,Android,Android Workmanager,我正在编写一个使用WorkManager的Android库。在代码的某个地方,我称之为这样的东西: val uploadTripRequest = OneTimeWorkRequest.Builder(UploadTripWorker::class.java) .setConstraints(someConstraints) .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, OneTimeWorkRequest.MIN_BACKOFF_
val uploadTripRequest = OneTimeWorkRequest.Builder(UploadTripWorker::class.java)
.setConstraints(someConstraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, OneTimeWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
.build()
WorkManager.getInstance(context)
.enqueueUniqueWork(WORKER_NAME, ExistingWorkPolicy.REPLACE, uploadTripRequest)
在我的build.gradle中,我有:implementation'androidx.work:workruntime:2.2.0'
正常情况下,一切都很完美。客户端应用程序调用时会出现问题,例如:
WorkManager.initialize(context, Configuration.Builder().setWorkerFactory(myWorkerFactory).build())
调用此函数时,我的库中的WorkManager未按预期工作doWork
方法不会在myUploadTripWorker
上调用,而是在客户端的myWorkerFactory提供的worker上执行
在我看来,WorkManager
在库中不可用,因为它是一个单例,有人可以通过initialize
方法更改它的行为。但我希望我错了
我有办法解决这个问题吗?当然,我不能告诉我的所有客户端不要使用
WorkManager.initialize()
方法。WorkManager v2.1引入了在这些情况下有帮助的类
它仍然要求应用程序开发人员以正确的方式实现它,正如您所说的WorkManager是一个单体
关键的一点是,如果应用程序需要自定义初始化和自定义WorkerFactory,它应该使用DelegatingWorkerFactory
,然后使用自己的WorkerFactory
这里的关键点是,应用程序的WorkerFactory应该检查worker类名,以确保它是正确的(通常在构造函数中注入一些参数)。如果类名不是应用程序所期望的名称,那么它可以返回null,DelegatingWorkerFactory
将注意找到要实例化的正确工人类
类似于(在应用程序代码中):
然后,应用程序需要将此WorkerFactory添加到已设置为自定义WorkerFactory的DelegatingWorkerFactory,使用:
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)
}
如果在库项目中有Worker和WorkerFactory,则禁用库清单中的默认初始值设定项似乎可以实现这一目的。因为库将有一个不同于应用程序的包,所以默认初始值设定项似乎会被触发,除非您禁用它
<provider android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="<library's package>.analytics.workmanager-init"
tools:node="remove" />
不确定这是否应该警告我该方法是从另一个包调用的
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()
}
}
<provider android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="<library's package>.analytics.workmanager-init"
tools:node="remove" />
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)