Android WorkManager工作约束,延迟与查询工作
WorkManager工作约束,延迟与查询工作
本文可能会混用“工作”与“任务”这两个词。
本文例子使用Kotlin
准备一个工作类(任务)UploadWorker2
class UploadWorker2(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
Log.d(TAG, "模拟执行任务2 ${Thread.currentThread()}")
return Result.success()
}
}
工作约束
约束可让工作延迟到满足最佳条件时运行。下面的约束适用于 WorkManager。
| 名称 | 说明 |
|---|---|
| NetworkType | 约束运行工作所需的网络类型。例如 Wi-Fi (UNMETERED)。 |
| BatteryNotLow | 若为 true,那么当设备处于“电量不足模式”时,工作不会运行。 |
| RequiresCharging | 若为 true,那么工作只能在设备充电时运行。 |
| DeviceIdle | 若为 true,则设备必须处于空闲状态才能运行工作。如果考虑到其他应用的性能,建议用这个约束。 |
| StorageNotLow | 若为 true,那么当设备上的存储空间不足时,工作不会运行。 |
可用Constraints.Builder()来创建工作约束。然后将Constraints实例分配给WorkRequest.Builder()。
也就是说,工作约束是针对工作WorkRequest的。
下面这个工作约束,只有1个要求,在设备使用计费流量是执行任务。
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.METERED)
.build()
val d1 = OneTimeWorkRequest.Builder(UploadWorker2::class.java)
.setConstraints(constraints)
.addTag("约束").build()
mIdList.add(d1.id) // 登记任务id,可去掉
WorkManager.getInstance(applicationContext).enqueue(d1)
真机测试中,如果一开始手机用着wifi,那么任务不会执行。而关掉wifi,打开流量开关,就会执行任务。
这就是满足最佳条件时运行。
NetworkType说明
androidx.work.NetworkType是一个枚举类。目前有
| 枚举 | 说明 |
|---|---|
| NOT_REQUIRED | 这个工作不需要网络 |
| CONNECTED | 这个工作需要有网络连接 |
| UNMETERED | 需要Wi-Fi |
| NOT_ROAMING | 非漫游网络 |
| METERED | 需要按流量计费的网络 |
延迟工作
如果工作没有约束,或者当工作加入队列时所有约束都得到了满足,那么系统可能会选择立即运行该工作。
如果不希望工作立即运行,可以给工作设定一个延迟时间。
下面这个工作是要延迟3秒钟。
val d1 = OneTimeWorkRequest.Builder(UploadWorker2::class.java)
.addTag("延迟1")
.setInitialDelay(3, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(applicationContext).enqueue(d1)
enqueue任务后,查一下任务状态。工作从ENQUEUED状态,执行完毕后变成了SUCCEEDED。
WorkInfo{mId='2794b4dd-7c02-4fd0-9851-8798a0da3bb2', mState=ENQUEUED, mOutputData=Data {}, mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker2, 延迟1], mProgress=Data {}}
WorkInfo{mId='2794b4dd-7c02-4fd0-9851-8798a0da3bb2', mState=SUCCEEDED, mOutputData=Data {}, mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker2, 延迟1], mProgress=Data {}}
查询工作
使用UUID查询
新建工作的时候,系统会分配一个UUID。我们可以记录UUID到mIdList里。通过UUID可以查询到工作当前的状态。
val mgr = WorkManager.getInstance(applicationContext)
for (id in mIdList) {
val cur = mgr.getWorkInfoById(id)
Log.d(TAG, "查询任务 ${cur.get()}")
}
一个工作状态的例子,状态是ENQUEUED
WorkInfo{mId='16cc292d-f140-488f-9ab5-a0d22b95d128', mState=ENQUEUED, mOutputData=Data {}, mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker, r1], mProgress=Data {}}
使用tag查询
前面我们给工作打上tag。可以用WorkManager的getWorkInfosByTag()方法把指定tag的工作查出来。
val mgr = WorkManager.getInstance(applicationContext)
for (w in mgr.getWorkInfosByTag("约束1").get()) {
Log.d(TAG, "$w")
}
工作状态的例子,下面这个工作UploadWorker状态是SUCCEEDED,tag里有约束1
WorkInfo{mId='fed1974c-77e5-46ba-8b38-f6c01d68fe4c', mState=SUCCEEDED, mOutputData=Data {}, mTags=[com.rustfisher.tutorial2020.workmanaer.WorkManagerAct$UploadWorker, 约束1], mProgress=Data {}}
需要注意的是,工作的状态是存储起来的。即使重启app或者手机,都可以查到这个工作的状态。
假设查询tag是约束1,我们能得到之前创建的含有这个约束1标签的工作。
参考
- WorkManager入门示例 https://an.rustfisher.com/android/jetpack/workManager/use1/
- 定义工作请求 https://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work
Android WorkManager工作约束,延迟与查询工作的更多相关文章
- Android WorkManager 定时任务
App有时可能需要定期运行某些工作.例如,可能要定期备份数据.上传信息到服务器,定期获取新的内容等等. 在app运行期间,我们使用Handler也可以完成定期的功能.在这里我们介绍WorkManage ...
- TFS API:二、TFS 代码查询工作项
TFS API:二.TFS 代码查询工作项 首先我们需要认识TFS的两大获取服务对象的类. 他们分别为TfsConfigurationServer和TfsTeamProjectCollection, ...
- TFS支持移动设备,微软已经走出了第一步(手机上更新、查询工作项)
TFS支持移动设备,微软已经走出了第一步! 从现在开始,你可以在手机浏览器上打开自己的VSTS团队项目,会看大手机版的工作项界面,你可以在手机设备上更新.查询工作项. 这是原生自带的,这些移动功能马上 ...
- Android 12(S) 图形显示系统 - BufferQueue的工作流程(九)
题外话 Covid-19疫情的强烈反弹,小区里检测出了无症状感染者.小区封闭管理,我也不得不居家办公了.既然这么大把的时间可以光明正大的宅家里,自然要好好利用,八个字 == 努力工作,好好学习 一.前 ...
- Android WorkManager使用入门
WorkManager使用入门 WorkManager提供了任务调度功能,我们可以对工作进行标记或命名. 我们用一个示例来演示如何使用WorkManager.本文使用Kotlin. 入门示例 grad ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- emulator-arm.exe 已停止工作、 emulator-x86 已停止工作
问题描述: emulator-arm.exe 已停止工作. emulator-x86 已停止工作.AVD模拟器启动一直黑屏.AVD模拟器启动一直显示andorid界面 解决方法: 1. sdk的安 ...
- 合并多个工作薄workbooks到一个工作薄workbook
微软示例教程 微软示例教程 Sub MergeAllWorkbooks() Dim SummarySheet As Worksheet Dim FolderPath As String Dim NRo ...
- 在Excel里如何将多个工作簿合并到一个工作簿中
在Excel里如何将多个工作簿合并到一个工作簿中 当你必须将多个工作簿合并到一个工作簿时,你遇到过麻烦吗?最让人心烦的就是需要合并的工作簿里有很多张工作表.有人能推荐方法解决这个问题吗? 利用VBA ...
随机推荐
- MySQL 插入中文后,显示为空白
https://blog.csdn.net/sun_hj_95/article/details/79488583 在MySQL中插入中文后,显示如下: 解决方案: 在my.ini (在MySQL的安装 ...
- Java多线程事务管理
今天要讨论的是"Java实现多线程单条数据事务管理",在此之前,顺便回顾一下实现多线程的几种方式 实现多线程的三种方式 一.继承Thread类 第一种方法是继承Thread类,重写 ...
- LevelDB学习笔记 (3): 长文解析memtable、跳表和内存池Arena
LevelDB学习笔记 (3): 长文解析memtable.跳表和内存池Arena 1. MemTable的基本信息 我们前面说过leveldb的所有数据都会先写入memtable中,在leveldb ...
- SLAM的数学基础(2):协方差和协方差矩阵
之前我们知道,方差是一组数据的离散程度,它的公式为: 那么如果我们有几组数据,需要知道这几组数据的协同性呢? 举个例子,还是在小红,几次考试成绩如下: 入学考试:数学:80,语文:80 期中考试:数学 ...
- 五个 .NET 性能小贴士
原文:bit.ly/3wSpO4o 作者:Nikita Starichenko 翻译:精致码农 大家好!今天我想和大家分享几个 .NET 的性能小贴士与基准测试. 我的系统环境: BenchmarkD ...
- DOS 常用命令集
net use $">\\ip\ipc$Content$nbsp;" " /user:" " 建立IPC空链接 net use $"& ...
- P6753 [BalticOI 2013 Day1] Ball Machine
P6753 [BalticOI 2013 Day1] Ball Machine 题意 给你一个树,每次从根节点放一个求,如果其子节点有空这个球会向下滚,若有多个节点为空则找儿子中以子树内编号的最小值为 ...
- Dijkstra和堆优化
Dijkstra算法 由于我之前一直记的迪杰斯特拉的翻译导致我把dijkstra写成了dijstra--所以下文#define dijstra dijkstra 我以后叫她迪杰克斯歘! Dijskra ...
- Linux虚拟机与主机网络连接配置与文件传输
网络配置 对于VMware虚拟机 1. 设置linux系统的网络配置,如下(NAT为默认配置,这里采用这一配置) 2. 主机中配置本地连接-属性-共享-勾选红框配置项,如下: 3.重启虚拟机. ...
- shell脚本(10)-流程控制while
一.while循环介绍 while循环与for一样,一般不知道循环次数使用for,不知道循环的次数时推荐使用while 二.while语法 while [ condition ] #条件为真才会循环, ...