Android WorkManager 定时任务
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配置添加kotlinOptions的jvmTarget
android {
// 其他配置...
kotlinOptions {
jvmTarget = "1.8"
}
}
创建定时任务
创建定时任务,用到PeriodicWorkRequestBuilder,传入定时的参数,build()得到任务实例。
交给WorkManager的enqueue方法即可。
val r1 = PeriodicWorkRequestBuilder<UploadWorker2>(15, TimeUnit.MINUTES)
.addTag("r1").build()
WorkManager.getInstance(applicationContext).enqueue(r1)
上面的代码,enqueue后会立刻执行一次任务。
多次创建任务,可以得到多个定时任务。
注意:可以定义的最短重复间隔是 15 分钟(与 JobScheduler API 相同)。
单一任务
如果不想要重复的定时任务,需要用WorkManager的enqueueUniquePeriodicWork方法。
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 {}}
参考
- WorkManager使用入门 https://an.rustfisher.com/android/jetpack/workManager/use1/
- WorkManager工作约束,延迟与查询工作 https://an.rustfisher.com/android/jetpack/workManager/use2/
- 定期工作 https://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work#schedule_periodic_work
- 观察工作 https://developer.android.com/topic/libraries/architecture/workmanager/how-to/managing-work#observing
Android WorkManager 定时任务的更多相关文章
- Android开发 定时任务清理数据
原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝 公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现 P ...
- [Android] Android 异步定时任务实现的三种方法(以SeekBar的进度自动实现为例)
[Android] Android 定时异步任务实现的三种方法(以SeekBar的进度自动实现为例) 一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及Ti ...
- Android WorkManager使用入门
WorkManager使用入门 WorkManager提供了任务调度功能,我们可以对工作进行标记或命名. 我们用一个示例来演示如何使用WorkManager.本文使用Kotlin. 入门示例 grad ...
- Android WorkManager工作约束,延迟与查询工作
WorkManager工作约束,延迟与查询工作 本文可能会混用"工作"与"任务"这两个词. 本文例子使用Kotlin 准备一个工作类(任务)UploadWork ...
- Android 新架构组件 -- WorkManager
Android WorkManager compile "android.arch.work:work-runtime:1.0.0-alpha02" 继承Worker类并实现doW ...
- Android省电开发 浅析
相信对于Android App省电的开发,一切性能优化都可以达到App的省电开发,所以一个省电的Android应用,性能优化占据很重要的位置.除此之外整理了几点关于Android应用省电的开发技巧. ...
- android 定时器(Handler Timer Thread AlarmManager CountDownTimer)
Android实现定时任务一般会使用以上(Handler Timer Thread AlarmManager CountDownTimer)五种方式.当然还有很多组合使用(比如Handler+Thre ...
- Android省电和提高效率
一.Android省电开发之性能优化 电量优化 Android应用开发中的网络.定位.传感器等都是比较耗电的特性,我们应该正确使用API来有效降低应用的耗电量. 1.BroadcastReceiver ...
- 《第一行代码》学习笔记39-服务Service(6)
1.Android中定时任务一般有两种实现方式:(1)使用Java API里提供的Timer类:(2)使用Android的Alarm机制. 但是,Timer类有个明显的短板,不太适用于那些需要长期在后 ...
随机推荐
- spring-3-spring整合mybatis
版本和依赖 MyBatis-Spring 需要以下版本: maven依赖 <dependency> <groupId>org.mybatis</groupId> & ...
- 微信小程序云开发-云存储的应用-识别通用印刷体
一.准备工作 1.创建云函数identify 2.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...
- 2021 NOI冬令营
2021 NOI冬令营 -- 本来想写得稍微文艺一点的,但是停课这么久已经退化到不会写文章了. 毕竟省选了我才来补的,时间也过去很久了. 毕竟这次我没有获得任何奖项. 我唯一的获得就是-- --好好看 ...
- 第十二篇 -- QMainWindow与QAction(剪切-复制-粘贴)
效果图: 按照上一节的方法,将剪切-复制-粘贴图标放置到工具栏后,为其指定槽函数.这些功能无需自己编写代码来实现,QPlainTextEdit提供了实现这些编辑功能的槽函数,如cut().copy() ...
- OpenCV 之 特征检测
特征,也称 兴趣点 或 关键点,如下:蓝框内区域平坦,无特征:黑框内有"边缘",红框内有"角点",后二者都可视为"特征" 角点作为一种特征, ...
- ifix历史数据(H04/H08/H24)转换为CSV文件导出
在最近的一次环保数据维护中,由于自己疏忽导致数据库中TP值并未有效记录,还好历史趋势有相关记录,问题是我该如何将.H24文件记录导出?在逛论坛后,无意发现一款工具解决了我的燃眉之急-HTD2CSV.e ...
- linux下编译常见错误
1.浮点数例外:除数为0 2.已杀死:空间过大 3.已放弃:时间过长 4.段错误:递归 / 循环出不来
- 三层交换机和VLAN
目录 一.VLAN的概述及优势 二.VLAN的种类 三.静态VLAN的配置 四.Trunk介绍与配置 五.三层交换机转发原理 一.VLAN的概述及优势 分割广播域 物理分割 逻辑分割 VLAN的优势: ...
- maze writeup
maze writeup 攻防世界的一道迷宫题,第一次接触这样的题,个人感觉很有意思,收获也挺多,做一篇笔记记录一下. 程序分析 __int64 sub_4006B0() { signed __int ...
- js遍历终极大法--再也不用苦逼的for循环了
while循环 while后面跟循环条件和执行语句,只要满足条件,就会一直执行里面的执行 var i = 0 while(i<10){ console.log(i) i++ } do...whi ...