App有时可能需要定期运行某些工作。例如,可能要定期备份数据、上传信息到服务器,定期获取新的内容等等。

在app运行期间,我们使用Handler也可以完成定期的功能。在这里我们介绍WorkManager使用定时任务的方法。

前面我们介绍了WorkManager的使用方法,约束和延迟等。本文介绍WorkManager的定时任务。如何创建定时任务,查看任务状态,取消任务。

本文使用kotlin

注意:可以定义的最短重复间隔是 15 分钟(与 JobScheduler API 相同)。

gradle

kotlin使用PeriodicWorkRequestBuilder时候报错误提示

Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6.

Please specify proper '-jvm-target' option

根据提示,在app的gradle配置添加kotlinOptionsjvmTarget

android {
// 其他配置... kotlinOptions {
jvmTarget = "1.8"
}
}

创建定时任务

创建定时任务,用到PeriodicWorkRequestBuilder,传入定时的参数,build()得到任务实例。

交给WorkManagerenqueue方法即可。

val r1 = PeriodicWorkRequestBuilder<UploadWorker2>(15, TimeUnit.MINUTES)
.addTag("r1").build()
WorkManager.getInstance(applicationContext).enqueue(r1)

上面的代码,enqueue后会立刻执行一次任务。

多次创建任务,可以得到多个定时任务。

注意:可以定义的最短重复间隔是 15 分钟(与 JobScheduler API 相同)。

单一任务

如果不想要重复的定时任务,需要用WorkManagerenqueueUniquePeriodicWork方法。

val r1 = PeriodicWorkRequestBuilder<UploadWorker2>(15, TimeUnit.MINUTES)
.addTag("r2").build()
WorkManager.getInstance(applicationContext)
.enqueueUniquePeriodicWork(
"单独的定时任务r2",
ExistingPeriodicWorkPolicy.KEEP,
r1)

PeriodicWorkRequestBuilder创建出任务后。

调用enqueueUniquePeriodicWork,此方法需要3个参数:

  • uniqueWorkName 唯一的任务名字
  • ExistingPeriodicWorkPolicy 发现任务重复时的处理方法
    • REPLACE 把旧的任务停止并删除,然后插入新的任务
    • KEEP 保留原来的任务,不新增任务
  • PeriodicWorkRequest 任务对象

enqueueUniquePeriodicWork方法能保证1个名字同时只有一个定时任务(PeriodicWorkRequest)。

如果是同样的名字(uniqueWorkName),插入任务时可能会替换旧任务(REPLACE),或者不影响旧任务(KEEP)。

查看任务

在这里我们用getWorkInfosByTag来查询任务

val status = WorkManager.getInstance(applicationContext).getWorkInfosByTag("r1")
val workInfoList: List<WorkInfo> = status.get()
for (w in workInfoList) {
Log.d("rustfisher.com", " $w")
}

查询结果的例子

 WorkInfo{mId='83d7d512-8a5d-4613-acbb-e73ee2855212', mState=ENQUEUED, mOutputData=Data {}, mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker2, r1], mProgress=Data {}}

取消任务

我们有多种取消任务的方法。

取消所有任务

cancelAllWork(),取消所有任务

WorkManager.getInstance(applicationContext).cancelAllWork()

取消单独的任务

cancelUniqueWork(uniqueWorkName: String),取消单独的任务,传入uniqueWorkName

WorkManager.getInstance(applicationContext).cancelUniqueWork("单独的定时任务r2")

取消传入tag的所有任务

cancelAllWorkByTag(tag),取消传入tag的所有任务

WorkManager.getInstance(applicationContext).cancelAllWorkByTag("r1")

取消特定UUID的任务

cancelWorkById(UUID),取消特定UUID的任务

WorkManager.getInstance(applicationContext).cancelWorkById(UUID)

取消任务后,再去查询任务状态,会发现mState=CANCELLED

WorkInfo{mId='7c9e0deb-5267-4ade-8b95-c695e57f274c', mState=CANCELLED, mOutputData=Data {}, mTags=[r2, com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker2], mProgress=Data {}}

参考

Android WorkManager 定时任务的更多相关文章

  1. Android开发 定时任务清理数据

    原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝 公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现 P ...

  2. [Android] Android 异步定时任务实现的三种方法(以SeekBar的进度自动实现为例)

    [Android] Android 定时异步任务实现的三种方法(以SeekBar的进度自动实现为例) 一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及Ti ...

  3. Android WorkManager使用入门

    WorkManager使用入门 WorkManager提供了任务调度功能,我们可以对工作进行标记或命名. 我们用一个示例来演示如何使用WorkManager.本文使用Kotlin. 入门示例 grad ...

  4. Android WorkManager工作约束,延迟与查询工作

    WorkManager工作约束,延迟与查询工作 本文可能会混用"工作"与"任务"这两个词. 本文例子使用Kotlin 准备一个工作类(任务)UploadWork ...

  5. Android 新架构组件 -- WorkManager

    Android WorkManager compile "android.arch.work:work-runtime:1.0.0-alpha02" 继承Worker类并实现doW ...

  6. Android省电开发 浅析

    相信对于Android App省电的开发,一切性能优化都可以达到App的省电开发,所以一个省电的Android应用,性能优化占据很重要的位置.除此之外整理了几点关于Android应用省电的开发技巧. ...

  7. android 定时器(Handler Timer Thread AlarmManager CountDownTimer)

    Android实现定时任务一般会使用以上(Handler Timer Thread AlarmManager CountDownTimer)五种方式.当然还有很多组合使用(比如Handler+Thre ...

  8. Android省电和提高效率

    一.Android省电开发之性能优化 电量优化 Android应用开发中的网络.定位.传感器等都是比较耗电的特性,我们应该正确使用API来有效降低应用的耗电量. 1.BroadcastReceiver ...

  9. 《第一行代码》学习笔记39-服务Service(6)

    1.Android中定时任务一般有两种实现方式:(1)使用Java API里提供的Timer类:(2)使用Android的Alarm机制. 但是,Timer类有个明显的短板,不太适用于那些需要长期在后 ...

随机推荐

  1. mybatis的增删改查返回值小析(六)

    本文验证了通过mybatis访问数据库时的,增删改查的返回值情况. 直接看代码. 1.service层 /** *@Author: Administrator on 2020/3/12 15:15 * ...

  2. 第四篇 -- Go语言string转其他类型

    1. string转int // 法1:string转int num_str := "1234567" /* ParseInt():查看文档https://studygolang. ...

  3. 创建多个Dialog时,namespace冲突问题的解决 -- 基于QT 5.2

    问题来源: 我用MainWindow作为主界面,Dialog作为设置界面,还需要一个AboutDialog作为关于界面. 设置界面的Dialog头文件dialog.h是这样的: // dialog.h ...

  4. Linux 查看内存命令

    Linux 查看内存命令 top命令, Linux的top命令提供Linux资源使用情况的实时更新信息.不仅可以查看Linux内存,也可以查看CPU以及各个进程之间的对资源的占用情况.使用方式如下: ...

  5. 右键发送 (sendto),创建快捷方式到自定义的位置,不仅仅是复制,就像 发送到 桌面快捷方式 一样

    TL;DR 在 SendTo 文件夹里加上一文件夹的快捷方式后,在右键发送到这个文件夹的是这些文件的一个副本,实际上是一个复制的过程,有时候我们只希望是快捷方式,那就得另想办法了. 方案如下: 创建一 ...

  6. Maven-内部多个项目依赖自动升级版本的部署

    需要自动升级版本的AAA项目发布 (有内部依赖时) 步骤比较复杂, 有一些需要根据实际情况调整. 考虑了以下几种可能性: 依赖模块的版本有更新 依赖模块版本没更新 依赖模块的版本号: 直接定义, 用属 ...

  7. HCNA Routing&Switching之STP基础

    前文我们了解了VLAN动态注册协议GVRP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15113770.html:今天我们来讨论下二层环路和STP相 ...

  8. Java流程控制04——Switch选择结构

    switch 多选择结构 switch case 语句判断一个变量与一系列值中某个值是否相等,每个支撑位一个分支. switch语句中的变量类型可以是: byte short int 或者 char ...

  9. mybatis动态sql总结

    前言 平时在开发中,针对动态sql这块目前是薄弱点,自己根据官网在对应项目边测试边写博客,此篇只是为了加深动态sql的熟练度,有不到之处敬请批评指正! 1.if 使用动态 SQL 最常见情景是根据条件 ...

  10. 35岁Android程序员被阿里辞退,生活压力太大痛哭,中年危机如何自救?

    多数人都喜欢安逸的生活,尤其是随着年龄的增长,很多人都希望工作和生活趋于稳定,不愿意再让生活有很大的变动.可是,当达到一定的年龄时,危机还是存在的. 之前有一位阿里员工在脉脉上,晒出了自己被辞退的经历 ...