自定义 WorkManager 配置和初始化

默认情况下,WorkManager 在您的应用启动时自动配置自身,使用适合大多数应用的合理选项。如果您需要更精细地控制 WorkManager 如何管理和调度工作,您可以通过自己初始化 WorkManager 来自定义 WorkManager 配置。

按需初始化

按需初始化允许您仅在需要该组件时创建 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 版本,有两个初始化选项。在大多数情况下,默认初始化 就足够了。为了更精确地控制 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() 参考文档。