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.delay
class 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():终止任务链,标记最终失败。
-
Android Jetpack WorkManager使用指南
925

被折叠的 条评论
为什么被折叠?



