当前位置: 首页 > java >正文

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

关键设计说明

  1. ​Worker 类型选择​

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

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

  2. ​约束条件(Constraints)​

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

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

  3. ​数据传递​

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

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

  4. ​任务链(Chaining)​

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

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

  5. ​错误处理​

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

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

http://www.xdnf.cn/news/17305.html

相关文章:

  • 突破距离桎梏:5G 高清视频终端如何延伸无人机图传边界
  • 无人机光伏巡检效率提升68%!陌讯动态融合算法实战解析
  • Shuffle SOAR使用学习经验
  • ElasticSearch相关术语介绍
  • 亚远景-ISO 42001:汽车AI安全的行业标准新趋势
  • 华为开源CANN,再次释放“昇腾转向”信号
  • vue3对比vue2的性能优化和提升 :Vue 3 vs Vue 2
  • Java的异常体系
  • hadoop HDFS 重置详细步骤
  • ReAct Agent 原生代码实现(纯Python实现)
  • 【指南版】网络与信息安全岗位系列(三):安全运维工程师
  • 前端技术架构设计文档(Vue2+Antd+Sass)
  • 关于AI应用案例计算机视觉、自然语言处理、推荐系统和生成式AI四大领域的详细技术分析。
  • Java垃圾回收(GC)探析
  • 护网行动之后:容器安全如何升级?微隔离打造内网“微堡垒”
  • 【智能协同云图库】第六期:基于 百度API 和 Jsoup 爬虫实现以图搜图
  • 时间复杂度和空间复杂度Java语言描述
  • 【渲染流水线】[应用阶段]-[渲染命令队列]以UnityURP为例
  • AutoMQ-Kafka的替代方案实战
  • 如何在 Ubuntu 24.04 中永久更改主机名
  • zookeeper因jute.maxbuffer启动异常问题排查处理
  • 【macOS操作系统部署开源DeepSeek大模型,搭建Agent平台,构建私有化RAG知识库完整流程】
  • 29-数据仓库与Apache Hive-创建库、创建表
  • MT信号四通道相关性预测的Informer模型优化研究
  • Linux中Docker Swarm实践
  • 手机控制断路器:智能家居安全用电的新篇章
  • SupChains技术团队:需求预测中减少使用分层次预测(五)
  • VSCode - 设置Python venv
  • PyTorch + PaddlePaddle 语音识别
  • 深入探索C++模板实现的单例模式:通用与线程安全的完美结合