Android 之 Jetpack WorkManager
WorkManager可以帮助在设备闲置或应用关闭时执行后台任务,特别适合需要定期执行的任务。提到WorkManager是Google推荐的用于处理后台任务的解决方案,它替代了IntentService、JobScheduler和AlarmManager等旧API
以下是一个基于 Kotlin 的 Android WorkManager 完整示例,结合了周期性任务、约束条件、数据传递和任务链等核心功能,遵循最新最佳实践:
1. 添加依赖(build.gradle)
dependencies {implementation "androidx.work:work-runtime-ktx:2.9.0" // 使用 KTX 扩展
}
2. 创建 Worker 类
一次性任务 Worker(带数据传递)
import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.Data
import androidx.work.WorkerParameters
import kotlinx.coroutines.delayclass DownloadWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {override suspend fun doWork(): Result {val fileUrl = inputData.getString("file_url") ?: return Result.failure()return try {// 模拟下载(实际中替换为真实逻辑)delay(5000)val outputData = Data.Builder().putString("file_path", "/storage/downloaded_file.jpg").build()Result.success(outputData) // 返回成功及输出数据 } catch (e: Exception) {Result.retry() // 失败时重试 }}
}
周期性任务 Worker(定时同步)
class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {override suspend fun doWork(): Result {return try {// 模拟数据同步fetchDataFromServer()Result.success()} catch (e: Exception) {Result.failure()}}private suspend fun fetchDataFromServer() {delay(3000) // 模拟网络请求}
}
3. 配置与调度任务
一次性任务(带约束条件)
// 约束:仅在充电状态且联网时执行[6,10](@ref)
val constraints = Constraints.Builder().setRequiresCharging(true).setRequiredNetworkType(NetworkType.CONNECTED).build()// 输入数据
val inputData = Data.Builder().putString("file_url", "https://example.com/image.jpg").build()// 构建请求
val downloadRequest = OneTimeWorkRequestBuilder<DownloadWorker>().setInputData(inputData).setConstraints(constraints).setInitialDelay(10, TimeUnit.MINUTES) // 延迟10分钟执行[9](@ref).build()// 调度任务
WorkManager.getInstance(context).enqueue(downloadRequest)
周期性任务(每15分钟同步,最小间隔)
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(15, TimeUnit.MINUTES // 最小间隔15分钟[1,6](@ref)
).build()// 避免重复调度
WorkManager.getInstance(context).enqueueUniquePeriodicWork("daily_sync",ExistingWorkPolicy.REPLACE, // 若存在旧任务则替换[10](@ref)syncRequest
)
4. 任务链(顺序执行)
val processRequest = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadRequest = OneTimeWorkRequestBuilder<UploadWorker>().build()// 顺序链:下载 → 处理 → 上传[4,8](@ref)
WorkManager.getInstance(context).beginWith(downloadRequest).then(processRequest).then(uploadRequest).enqueue()
5. 监听任务状态
// 通过 ID 取消单个任务[5](@ref)
WorkManager.getInstance(context).cancelWorkById(downloadRequest.id)// 取消所有 "sync" 标签的任务
WorkManager.getInstance(context).cancelAllWorkByTag("sync")
关键设计说明
Worker 类型选择
CoroutineWorker
:替代传统Worker
,支持协程异步操作,避免阻塞线程。
PeriodicWorkRequest
:用于定时任务(如数据同步),最小间隔 15 分钟。
约束条件(Constraints)
灵活控制执行时机(如充电中、联网状态)。
避免在移动数据下执行耗流量任务,提升用户体验。
数据传递
输入:通过
setInputData()
传递参数(如 URL)。输出:使用
Result.success(outputData)
返回结果,供后续任务或 UI 使用。
任务链(Chaining)
确保任务顺序执行(如先下载再处理)。
自动传递上游任务的输出数据给下游任务。
错误处理
Result.retry()
:触发退避重试策略(默认指数退避)。
Result.failure()
:终止任务链,标记最终失败。