Android WorkManager不支持';当客户端调用WorkManager.initialize()时,无法在库中工作

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_

我正在编写一个使用WorkManager的Android库。在代码的某个地方,我称之为这样的东西:

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
方法不会在my
UploadTripWorker
上调用,而是在客户端的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)