2、环境搭建与依赖配置:在build.gradle中引入WorkManager依赖、Kotlin DSL配置示例、初始化WorkManager、检查WorkManager版本兼容性。

好,咱们正式开始动手了。

这一章其实没什么高深的理论,但却是整个课程的地基。我见过太多人,代码写得飞起,结果一编译就挂,最后发现是依赖版本没对齐。嗯,这种坑,咱们今天一次性填平。

2.1 在build.gradle中引入WorkManager依赖

先说说最基础的事——怎么把WorkManager请进你的项目。

现在Android开发主流已经全面转向Kotlin DSL了。我个人也更推荐用Kotlin DSL来写构建脚本,类型安全、代码提示友好,写起来舒服很多。

你需要在模块级别的 build.gradle.kts 文件中添加如下依赖:

dependencies {
    // WorkManager 核心库
    implementation("androidx.work:work-runtime-ktx:2.9.0")
    
    // 如果你需要配合RxJava使用(可选)
    // implementation("androidx.work:work-rxjava2:2.9.0")
    
    // 如果你需要配合Hilt做依赖注入(可选)
    // implementation("androidx.work:work-hilt:1.0.0")
}

这里有个细节我想提醒你——work-runtime-ktx 这个 artifact 已经包含了 Kotlin 扩展方法。你不需要再单独加 work-runtime,否则反而可能引起冲突。我在项目中就遇到过有人两个都加了,结果编译时报了一堆“重复类”的错误。

⚠️ 版本号别写死
上面我写的是 2.9.0,但这只是举例。实际开发中,我建议你去 官方版本页面 查一下最新的稳定版。或者,你也可以用 + 号通配符(但不推荐,容易出幺蛾子)。

2.2 Kotlin DSL配置示例——完整版

光加一行依赖还不够。我习惯把整个模块的构建脚本整理得干干净净。下面是一个完整的 build.gradle.kts 示例,你可以直接参考:

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("kotlin-kapt") // 如果你用Hilt或Room,需要这个
}

android {
    namespace = "com.example.workmanagerdemo"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.workmanagerdemo"
        minSdk = 21
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = "17"
    }
}

dependencies {
    implementation("androidx.core:core-ktx:1.12.0")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
    implementation("androidx.activity:activity-compose:1.8.2")
    
    // WorkManager
    implementation("androidx.work:work-runtime-ktx:2.9.0")
}

你看,其实没什么特别的。但有一点我想强调——minSdk 不要低于 21。WorkManager 虽然支持 API 14+,但低于 21 的设备它会走 AlarmManager 或 BroadcastReceiver 兜底方案,功能受限。说白了,如果你还在支持 Android 5.0 以下的设备,那 WorkManager 的很多高级特性(比如 WorkManager 的延迟约束、组合任务)可能用不了。

2.3 初始化WorkManager

依赖加好了,接下来就是初始化。

WorkManager 默认是自动初始化的。你什么都不用做,它就能正常工作。为什么?因为它在 AndroidManifest 里注册了一个 ContentProvider,应用启动时自动完成初始化。

但如果你需要自定义配置(比如自定义线程池、日志级别、或者禁用自动初始化),那就得手动来了。

手动初始化的步骤很简单:

  1. 在 AndroidManifest 中禁用自动初始化
  2. 在 Application 的 onCreate() 中手动调用

先看第一步,在 AndroidManifest.xml 中添加:

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    android:enabled="false"
    android:exported="false" />

<!-- 注意:enabled="false" 是关键 -->

然后,在你的 Application 类中:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        
        val config = Configuration.Builder()
            .setMinimumLoggingLevel(android.util.Log.INFO)
            .setExecutor(Executors.newFixedThreadPool(4))
            .build()
        
        WorkManager.initialize(this, config)
    }
}
💡 我的习惯
除非你有特殊需求(比如要替换线程池、或者做测试时用 TestListenableWorker),否则我建议你直接用自动初始化。省心,而且官方推荐。手动初始化一旦写错,WorkManager 可能静默失效,排查起来很头疼。

2.4 检查WorkManager版本兼容性

版本兼容性这个问题,说实话,我踩过坑。

有一次我把项目从 AGP 7.0 升级到 8.0,结果 WorkManager 的 setInitialDelay 方法突然报红了。查了半天,发现是 WorkManager 2.7.0 之后改了 API 签名。

所以,我建议你在引入依赖后,做两件事:

  • 检查你的 minSdk 版本:WorkManager 2.7+ 对 minSdk 21 以下的设备支持有限。
  • 检查你的 Kotlin 版本:WorkManager 2.9.0 要求 Kotlin 1.8+,否则编译会报 Unresolved reference

下面这张表是我整理的,你可以对照着看:

WorkManager 版本 最低 Kotlin 版本 最低 AGP 版本 备注
2.7.x 1.6.0 7.0 支持 setExpedited 快速任务
2.8.x 1.7.0 7.2 新增 ForegroundInfo 改进
2.9.x 1.8.0 8.0 修复了多个内存泄漏问题

怎么快速检查你当前项目的版本?在终端里跑一行命令就行:

./gradlew :app:dependencies --configuration implementation | grep work

输出结果里会显示 WorkManager 的版本号。如果发现版本不对,去 build.gradle.kts 里改一下版本号,然后 Sync 一下就好。

🔑 核心要点
  • 依赖用 work-runtime-ktx,别加重复的库
  • minSdk 最好 ≥ 21,否则功能受限
  • 自动初始化够用就别手动搞,省心
  • 版本号一定要和 Kotlin/AGP 版本匹配

好了,环境搭建就这些。说白了,就是加一行依赖、确认一下版本、然后让 WorkManager 自己跑起来。下一章咱们开始写第一个真正的后台任务——到时候你会觉得,嗯,这东西真香。


公众号:蓝海资料掘金营,微信deep3321