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。可以用WorkManagergetWorkInfosByTag()方法把指定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标签的工作。

参考

Android WorkManager工作约束,延迟与查询工作的更多相关文章

  1. Android WorkManager 定时任务

    App有时可能需要定期运行某些工作.例如,可能要定期备份数据.上传信息到服务器,定期获取新的内容等等. 在app运行期间,我们使用Handler也可以完成定期的功能.在这里我们介绍WorkManage ...

  2. TFS API:二、TFS 代码查询工作项

    TFS API:二.TFS  代码查询工作项 首先我们需要认识TFS的两大获取服务对象的类. 他们分别为TfsConfigurationServer和TfsTeamProjectCollection, ...

  3. TFS支持移动设备,微软已经走出了第一步(手机上更新、查询工作项)

    TFS支持移动设备,微软已经走出了第一步! 从现在开始,你可以在手机浏览器上打开自己的VSTS团队项目,会看大手机版的工作项界面,你可以在手机设备上更新.查询工作项. 这是原生自带的,这些移动功能马上 ...

  4. Android 12(S) 图形显示系统 - BufferQueue的工作流程(九)

    题外话 Covid-19疫情的强烈反弹,小区里检测出了无症状感染者.小区封闭管理,我也不得不居家办公了.既然这么大把的时间可以光明正大的宅家里,自然要好好利用,八个字 == 努力工作,好好学习 一.前 ...

  5. Android WorkManager使用入门

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

  6. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  7. emulator-arm.exe 已停止工作、 emulator-x86 已停止工作

    问题描述: emulator-arm.exe 已停止工作. emulator-x86 已停止工作.AVD模拟器启动一直黑屏.AVD模拟器启动一直显示andorid界面 解决方法: 1.   sdk的安 ...

  8. 合并多个工作薄workbooks到一个工作薄workbook

    微软示例教程 微软示例教程 Sub MergeAllWorkbooks() Dim SummarySheet As Worksheet Dim FolderPath As String Dim NRo ...

  9. 在Excel里如何将多个工作簿合并到一个工作簿中

    在Excel里如何将多个工作簿合并到一个工作簿中 当你必须将多个工作簿合并到一个工作簿时,你遇到过麻烦吗?最让人心烦的就是需要合并的工作簿里有很多张工作表.有人能推荐方法解决这个问题吗? 利用VBA ...

随机推荐

  1. CG-CTF WxyVM2

    一.原本以为要动调,因为出现了这个,函数太长,无法反编译 后面才知道这玩意可以在ida的配置文件里面去改,直接改成1024. 里面的MAXFUNSIZE改成1024,就可以反编译了,这个长度是超过这个 ...

  2. buu 简单注册器

    一.本身对安卓逆向这块不是很熟悉,为了看这题稍微了解了一下,原来安卓虚拟机解释运行的是dex文件,和java的字节码不一样,然后是smail语法,这块我不会,所以找个了个神器来反编译2333,然后这题 ...

  3. SqlServer常用语句整理

    先记录下来 以后整理 1.常用语句 1.1update连表更新 update a set a.YCaseNo = a.WordName + '['+ convert(varchar,a.CaseYea ...

  4. Linux | Shell脚本的编写

    Shell 脚本的介绍 Shell脚本通过Shell终端解释器当作人与计算机硬件之间的翻译官,用户可以通过它执行各种命令,不仅有简单的,还有复杂的,比如:判断.循环.分支等这些高级编程中才有的特性.S ...

  5. 「Ynoi2015」我回来了

    「Ynoi2015」我回来了 这东西已经不是 Ynoi 了,因为太水被嫌弃了. 如何提升自己的数据结构能力?从Ynoi做起 题目链接 其实这个题很小清新的辣,而且不卡常. 由于边权为 \(1\),所以 ...

  6. UI作品评审总结:切忌过度设计,注意设计闭环

    本期,我们一起看看学长认证模块--UI同学的作品评审.   拿好小板凳,做好笔记,我们开始吧!     我们拿了两个典型的作品进行了一个讲解,做的特色都还不错,但是都有些小问题.   先来看一下第一位 ...

  7. DIV+css排版问题技巧总结---v客学院技术分享

                DIV+css排版问题技巧总结 一.排版思路 1.从上到下,从左到右,从大到小. 2.首先确定排版分区,排除色块分布,然后再从简单的部分开始. 3.在某一块内将HTML部分写好 ...

  8. 莫比乌斯反演&整除分块学习笔记

    整除分块 用于计算$\sum_{i=1}^n f(\lfloor{n/i} \rfloor)*i$之类的函数 整除的话其实很多函数值是一样的,对于每一块一样的商集中处理即可 若一个商的左边界为l,则右 ...

  9. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  10. JavaScript实现拖放效果

    JavaScript实现拖放效果 笔者实现该效果也是套用别人的轮子的.传送门 然后厚颜无耻的贴别人的readme~,笔者为了方便查阅就直接贴了,有不想移步的可以看这篇.不过还是最好请到原作者的GitH ...