WorkManager のカスタム構成と初期化

デフォルトでは、WorkManager はアプリの起動時に自動的に構成され、ほとんどのアプリに適した合理的なオプションが設定されます。WorkManager が作業を管理およびスケジュールする方法を詳細に制御する必要がある場合は、WorkManager を自分で初期化して、WorkManager 構成をカスタマイズできます。

WorkManager のカスタム初期化を最も柔軟に行う方法は、WorkManager 2.1.0 以降で利用可能なオンデマンド初期化を使用することです。他の方法については、後で説明します

オンデマンド初期化

オンデマンド初期化では、アプリが起動するたびではなく、そのコンポーネントが必要な場合にのみ WorkManager を作成できます。これにより、クリティカルなスタートアップ パスから WorkManager が除外され、アプリのスタートアップのパフォーマンスが向上します。オンデマンド初期化を使用するには、以下の手順を実施します。

デフォルトのイニシャライザを削除する

カスタム構成を設定するには、まずデフォルトのイニシャライザを削除する必要があります。そのためには、マージルール tools:node="remove" を使用して、AndroidManifest.xml を更新します。

WorkManager 2.6 以降、アプリの起動は WorkManager の内部で使用されています。カスタムのイニシャライザを指定するには、androidx.startup ノードを削除する必要があります。

アプリでアプリの起動を使用しない場合は、完全に削除できます。

 <!-- If you want to disable android.startup completely. -->
 <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove">
 </provider>

それ以外の場合は、WorkManagerInitializer ノードのみを削除します。

 <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- If you are using androidx.startup to initialize other components -->
    <meta-data
        android:name="androidx.work.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />
 </provider>

2.6 より前のバージョンの WorkManager を使用している場合は、代わりに workmanager-init を削除します。

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />

マニフェストにおけるマージルールの使用の詳細については、複数のマニフェスト ファイルをマージする方法のドキュメントをご覧ください。

Configuration.Provider を実装する

Application クラスが Configuration.Provider インターフェースを実装するように設定して、Configuration.Provider.getWorkManagerConfiguration() の独自の実装を用意します。WorkManager を使用する必要がある場合は、必ず WorkManager.getInstance(Context) メソッドを呼び出します。WorkManager はアプリのカスタム getWorkManagerConfiguration() メソッドを呼び出して、その Configuration を検出します(自分で WorkManager.initialize() を呼び出す必要はありません)。

カスタム getWorkManagerConfiguration() 実装の例を次に示します。

Kotlin


class MyApplication() : Application(), Configuration.Provider {
     override fun getWorkManagerConfiguration() =
           Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.INFO)
                .build()
}

Java


class MyApplication extends Application implements Configuration.Provider {
    @Override
    public Configuration getWorkManagerConfiguration() {
        return new Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.INFO)
                .build();
    }
}

WorkManager 2.1.0 より前のカスタム初期化

バージョン 2.1.0 より前の WorkManager には、2 つの初期化方法があります。ほとんどの場合、デフォルトの初期化で十分です。WorkManager をより正確に制御する場合は、独自の構成を指定できます

デフォルトの初期化

WorkManager は、アプリの起動時に、カスタム ContentProvider により自動的に初期化されます。このコードは内部クラス androidx.work.impl.WorkManagerInitializer に存在し、デフォルトの Configuration を使用します。デフォルトのイニシャライザは、明示的に無効にする場合を除き、自動的に使用されます。デフォルトのイニシャライザは、ほとんどのアプリに適しています。

カスタム初期化

初期化プロセスを制御したい場合は、カスタム構成を定義する前に、デフォルトのイニシャライザを無効にする必要があります。

デフォルトのイニシャライザを削除したら、WorkManager を手動で初期化できます。

Kotlin


// provide custom configuration
val myConfig = Configuration.Builder()
    .setMinimumLoggingLevel(android.util.Log.INFO)
    .build()

// initialize WorkManager
WorkManager.initialize(this, myConfig)

Java


// provide custom configuration
Configuration myConfig = new Configuration.Builder()
    .setMinimumLoggingLevel(android.util.Log.INFO)
    .build();

//initialize WorkManager
WorkManager.initialize(this, myConfig);

WorkManager シングルトンの初期化が Application.onCreate()ContentProvider.onCreate() のいずれかで実行されるようにします。

利用可能なカスタマイズの完全なリストについては、Configuration.Builder() リファレンス ドキュメントをご覧ください。