1. 项目初始化与环境搭建
本章是《Compose UI与WorkManager状态联动实战》的起点,目标是搭建一个同时集成Jetpack Compose(声明式UI)和WorkManager(后台任务调度)的Android项目环境。正确的项目初始化与依赖配置是后续所有实践的基础,直接影响编译效率、平台兼容性以及运行时稳定性。我们将从创建新项目开始,逐步配置Gradle版本、minSdk以及核心依赖。
1.1 项目结构总览
在动手编码前,先通过下面的内联SVG图理解本课程项目的整体技术架构,以及本章搭建环境在其中的位置。
1.2 核心技术原理
项目初始化不仅是添加几行依赖,更涉及Gradle版本兼容性、编译SDK与minSdk的平衡、以及Compose编译器与Kotlin版本的匹配。理解以下原理能有效避免大部分的环境错误。
| 核心概念 | 原理说明 | 本课程选型 |
|---|---|---|
| Compose BOM | Bill of Materials,统一管理Compose各子模块(ui、material3、activity-compose)版本,避免版本冲突。 | 2024.01.00 或更高 |
| WorkManager | 兼容Android 8.0+的后台任务调度库,利用JobScheduler/Exact Alarms实现可靠的一次性与周期性任务。 | 2.9.0 或更高 |
| minSdk | 应用支持的最低API级别。过低会导致WorkManager内部降级使用AlarmManager,线程模型不稳定。 | 26 (Android 8.0) |
| Kotlin Compiler Extension | Compose编译器插件与Kotlin版本必须一一对应,否则触发IncompatibleComposeVersion错误。 |
Kotlin 1.9.0 + Compose Compiler 1.5.1 |
1.3 实现流程:分步操作
遵循以下6个步骤完成项目初始化。所有命令和配置片段请直接复制到对应的Gradle文件中。
前置条件:确保已安装 Android Studio Hedgehog (2023.1.1) 或更高版本,并确认JAVA_HOME指向JDK 17。
步骤1:创建新项目
- 在Android Studio中选择 New Project → Empty Compose Activity。
- 填写项目名:
ComposeWorkManagerDemo,Package:com.example.cwm。 - 选择 Minimum SDK:API 26。
步骤2:配置根目录 build.gradle.kts
统一Gradle插件版本和Kotlin版本:
plugins {
id("com.android.application") version "8.1.4" apply false
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}
tasks.register("clean", Delete::class) {
delete(rootProject.layout.buildDirectory)
}
步骤3:配置模块级 build.gradle.kts
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.example.cwm"
compileSdk = 34
defaultConfig {
applicationId = "com.example.cwm"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.1"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
// Compose BOM
val composeBom = platform("androidx.compose:compose-bom:2024.01.00")
implementation(composeBom)
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.material3:material3")
implementation("androidx.activity:activity-compose:1.8.2")
// WorkManager
implementation("androidx.work:work-runtime-ktx:2.9.0")
// 调试与测试
implementation("androidx.compose.ui:ui-tooling-preview")
debugImplementation("androidx.compose.ui:ui-tooling")
testImplementation("junit:junit:4.13.2")
}
步骤4:同步Gradle
- 点击Android Studio工具栏的 Sync Now。
- 观察 Build Output 窗口,确保无红色错误。
步骤5:验证WorkManager依赖
在 MainActivity.kt 中添加如下测试代码,确认依赖可被识别:
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.Worker
import androidx.work.WorkerParameters
import android.content.Context
class TestWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
// 模拟任务
return Result.success()
}
}
// 在onCreate中测试
val workRequest = OneTimeWorkRequestBuilder<TestWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)
步骤6:运行项目(模拟器/真机)
- 选择目标设备(API 26+),点击 Run。
- 应用成功安装并显示空白Compose界面,即表示初始化完成。
1.4 常见错误与调试
| 错误现象 | 根因 | 解决方案 |
|---|---|---|
Unresolved reference: compose |
Compose BOM未添加或模块级buildFeatures未开启 | 检查 buildFeatures { compose = true } 以及在dependencies中引入BOM |
Failed to resolve: work-runtime-ktx:2.9.0 |
仓库未添加(mavenCentral / google()) | 在根目录 settings.gradle.kts 添加 mavenCentral() 和 google() |
IncompatibleComposeVersion |
Kotlin版本与Compose编译器扩展版本不匹配 | 使用官方兼容版本对照表:此处Kotlin 1.9.0 ↔ Compose Compiler 1.5.1 |
INSTALL_FAILED_OLDER_SDK |
测试设备API低于minSdk 26 | 更换模拟器系统镜像为API 26+,或升级真机固件 |
调试技巧:如果项目同步失败,优先检查
settings.gradle.kts 中的 pluginManagement 和 dependencyResolutionManagement 配置。常见遗漏是未包含 repositories { google() mavenCentral() }。
1.5 性能与稳定性建议
- minSdk 26是稳定基线:WorkManager在API 26+使用JobScheduler,线程池管理更高效;低于26版本降级到AlarmManager+广播,功耗和稳定性都有风险。
- Compose编译缓存:可添加
org.gradle.caching=true到gradle.properties,减少重复编译时间。 - 避免版本频繁浮动:课程中锁定的BOM版本和WorkManager版本经过联调验证。生产环境可改为变量统一管理版本。
注意:不要随意升级Compose BOM到非稳定版(如alpha、beta),可能引入未暴露的API变更。始终使用Release版本(如2024.01.00)以保证代码与课程保持一致。