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. JavaScript学习笔记:你必须要懂的原生JS(一)

    1.原始类型有哪几种?null是对象吗?原始数据类型和复杂数据类型存储有什么区别? 原始类型有6种,分别是undefined,null,bool,string,number,symbol(ES6新增) ...

  2. 【超值分享】为何写服务器程序需要自己管理内存,从改造std::string字符串操作说起。。。

    服务器程序为何要进行内存管理,管中窥豹,让我们从string字符串的操作说起...... new/delete是用于c++中的动态内存管理函数,而malloc/free在c++和c中都可以使用,本质上 ...

  3. VM虚拟机桥接模式无法联网、NAT模式能正常联网

    桥接模式:使虚拟机客户机可以和主机在同一网段,这样,和主机同局域网内的其他主机就也可以ping到虚拟机了: 因此,虚拟机设置为桥接模式,这样以后就可以方便的使用虚拟机了: 有时,虚拟机为桥接模式上不了 ...

  4. Scanner的基本语法及用法

    一.Scanner对象 基本语法中并没有实现程序和人的交互,但是Java给我们提供了一个这样的工具类,我们可以获取用户的输入.java.util.Scanner是Java5的新特征,我们可以通过Sca ...

  5. 基于pygame框架的打飞机小游戏

    import pygame from pygame.locals import * import time import random class Base(object): "" ...

  6. 第二章 Vant的v-cell的v-for使用

    遍历加载list数据,类似el-table 一.问题描述 由于VantUI中没有类似于el-table的table组件,看官网的范例,只找到了cell组件有v-for

  7. Python小白的数学建模课-15.图论基本概念

    图论中所说的图,不是图形图像或地图,而是指由顶点和边所构成的图形结构. 图论不仅与拓扑学.计算机数据结构和算法密切相关,而且正在成为机器学习的关键技术. 本系列结合数学建模的应用需求,来介绍 Netw ...

  8. 三层交换机和VLAN

    目录 一.VLAN的概述及优势 二.VLAN的种类 三.静态VLAN的配置 四.Trunk介绍与配置 五.三层交换机转发原理 一.VLAN的概述及优势 分割广播域 物理分割 逻辑分割 VLAN的优势: ...

  9. ssrf解题记录

    ssrf解题记录 最近工作需要做一些Web的代码审计,而我Web方面还比较薄弱,决定通过一些ctf的题目打打审计基础,练练思维,在博客上准备开几个专题专门记录刷题的过程. pwn题最近做的也很少,也要 ...

  10. NCB | 定量蛋白质组学揭示细胞外泌体通用标志物Syntenin-1

    外泌体 (exosomes) 是由哺乳动物细胞通过"内吞-融合-外排"等机制,主动向胞外释放的纳米级 (直径40~60 nm) 双层囊泡小体,携带蛋白质.核酸.脂质等多种生物活性分 ...