Skip to content

WorkManager

koin-androidx-workmanager 项目旨在提供 Android WorkManager 相关功能。

WorkManager DSL

设置 WorkManager

启动时,在你的 KoinApplication 声明中,使用 workManagerFactory() 关键字来设置自定义的 WorkManager 实例:

kotlin
class MainApplication : Application(), KoinComponent {

    override fun onCreate() {
        super.onCreate()

        startKoin {
            // setup a WorkManager instance
            workManagerFactory()
            modules(...)
        }

        setupWorkManagerFactory()
}

同样重要的是,你需要编辑你的 AndroidManifest.xml 文件,以防止 Android 初始化其默认的 WorkManagerFactory,如 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#remove-default 所示。否则将导致应用崩溃。

xml
    <application . . .>
        . . .
        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">
            <meta-data
                android:name="androidx.work.WorkManagerInitializer"
                android:value="androidx.startup"
                tools:node="remove" />
        </provider>
    </application>

声明 ListenableWorker

kotlin
val appModule = module {
    single { MyService() }
    worker { MyListenableWorker(get()) }
}

创建额外的 WorkManager 工厂

你也可以编写一个 WorkManagerFactory 并将其交给 Koin。它将被添加为委托。

kotlin
class MainApplication : Application(), KoinComponent {

    override fun onCreate() {
        super.onCreate()

        startKoin {
           workManagerFactory(workFactory1, workFactory2)
           . . .
        }

        setupWorkManagerFactory()
    }
}

如果 Koin 和 workFactory1 提供的 WorkManagerFactory 都能实例化一个 ListenableWorker,那么将使用 Koin 提供的工厂。

几点假设

在 Koin 库本身中添加清单更改

如果 koin-androidx-workmanager 自身的清单文件禁用了默认的 WorkManager,那么可以为应用开发者减少一个步骤。然而,这可能会令人困惑,因为如果应用开发者不初始化 Koin 的 WorkManager 基础设施,他们最终将没有可用的 WorkManager 工厂。

这方面 checkModules 可能会有所帮助:如果项目中任何类实现了 ListenableWorker,我们检查清单和代码,确保它们合理?

DSL 改进选项:

kotlin

val workerFactoryModule = module {
   factory<WorkerFactory> { WorkerFactory1() }
   factory<WorkerFactory> { WorkerFactory2() }
}

然后让 Koin 内部机制执行类似操作

kotlin
fun Application.setupWorkManagerFactory(
  // no vararg for WorkerFactory
) {
. . .
            getKoin().getAll<WorkerFactory>()
                .forEach {
                    delegatingWorkerFactory.addFactory(it)
                }
}