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.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,应用启动时自动完成初始化。
但如果你需要自定义配置(比如自定义线程池、日志级别、或者禁用自动初始化),那就得手动来了。
手动初始化的步骤很简单:
- 在 AndroidManifest 中禁用自动初始化
- 在 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 自己跑起来。下一章咱们开始写第一个真正的后台任务——到时候你会觉得,嗯,这东西真香。