メインコンテンツまでスキップ

WorkManager

koin-androidx-workmanager プロジェクトは、Android WorkManager の機能を提供することに特化しています。

WorkManager DSL

WorkManager のセットアップ

まず、KoinApplication の宣言で、workManagerFactory() キーワードを使用してカスタム WorkManager インスタンスをセットアップします。

class MainApplication : Application(), KoinComponent {

override fun onCreate() {
super.onCreate()

startKoin {
// WorkManager インスタンスをセットアップ
workManagerFactory()
modules(...)
}

setupWorkManagerFactory()
}

また、AndroidManifest.xml を編集して、Android がデフォルトの WorkManagerFactory を初期化しないようにすることが重要です。https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#remove-default に示すようにしてください。そうしないと、アプリがクラッシュします。

    <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 の宣言

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

WorkManagerFactory の追加作成

WorkManagerFactory を記述して Koin に渡すこともできます。これはデリゲートとして追加されます。

class MainApplication : Application(), KoinComponent {

override fun onCreate() {
super.onCreate()

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

setupWorkManagerFactory()
}
}

Koin と workFactory1 が提供する WorkManagerFactory の両方が ListenableWorker をインスタンス化できる場合、Koin が提供するファクトリが使用されます。

いくつかの前提

koin ライブラリ自体にマニフェストの変更を追加する

koin-androidx-workmanager 自身のマニフェストがデフォルトの WorkManager を無効にすれば、アプリケーション開発者にとって 1 つ手順を減らすことができます。ただし、アプリ開発者が Koin の WorkManager インフラストラクチャを初期化しない場合、使用可能な WorkManager ファクトリがなくなるため、混乱する可能性があります。

これは、checkModules が役立つ可能性があります。プロジェクト内のクラスが ListenableWorker を実装している場合、マニフェストとコードの両方を調べて、それらが意味をなしていることを確認します。

DSL の改善オプション:


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

次に、Koin の内部処理で次のようなことを行います。

fun Application.setupWorkManagerFactory(
// WorkerFactory には vararg はありません
) {
. . .
getKoin().getAll<WorkerFactory>()
.forEach {
delegatingWorkerFactory.addFactory(it)
}
}