Android 之 Jetpack WorkManager

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.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")

关键设计说明

  1. ​Worker 类型选择​

    • CoroutineWorker​:替代传统 Worker,支持协程异步操作,避免阻塞线程。

    • PeriodicWorkRequest​:用于定时任务(如数据同步),最小间隔 15 分钟。

  2. ​约束条件(Constraints)​

    • 灵活控制执行时机(如充电中、联网状态)。

    • 避免在移动数据下执行耗流量任务,提升用户体验。

  3. ​数据传递​

    • ​输入​​:通过 setInputData()传递参数(如 URL)。

    • ​输出​​:使用 Result.success(outputData)返回结果,供后续任务或 UI 使用。

  4. ​任务链(Chaining)​

    • 确保任务顺序执行(如先下载再处理)。

    • 自动传递上游任务的输出数据给下游任务。

  5. ​错误处理​

    • Result.retry()​:触发退避重试策略(默认指数退避)。

    • Result.failure()​:终止任务链,标记最终失败。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值