WorkManager对比AsyncTask, ThreadPool的优势:WorkManager里面的任务在应用退出之后还可以继续执行。AsyncTask, ThreadPool里面的任务在应用退出之后不会执行。WorkManager自动选用JobScheduler, 或是AlarmManager来实现后台任务。

使用WorkManager的一些任务示例:

上载日志、将过滤器应用于图像并保存图像、定期将本地数据与网络同步等。

优点包括:

  • 支持异步一次性和定期任务
  • 支持网络条件,存储空间和充电状态等约束
  • 链接复杂的工作请求,包括并行运行工作
  • 一个工作请求的输出用作下一个工作的输入
  • LiveData支持可轻松在UI中显示工作请求状态

核心类概述
1 Worker
Worker是一个抽象类,这个类用来指定具体需要执行的任务。使用时要继承这个类并且实现里面的doWork()方法,在其中写具体的业务逻辑。

2 WorkRequest
代表一项任务请求。一个 WorkRequest对象至少要指定一个Worker类。同时,还可以向WorkRequest对象添加 ,指定任务应运行的环境等。每个人WorkRequest都有一个自动生成的唯一ID, 可以使用该ID来执行诸如取消排队的任务或获取任务状态等操作。WorkRequest是一个抽象类; 有两个直接子类 OneTimeWorkRequest和 PeriodicWorkRequest。与WorkerRequest相关的有如下两个类:

① WorkRequest.Builder:用于创建WorkRequest对象的助手类 ,其有两个子类OneTimeWorkRequest.Builder和 PeriodicWorkRequest.Builder,分别对应两者创建上述两种WorkerRequest。
② Constraints:指定任务运行时的限制(例如,“仅在连接到网络时才能运行”)。可以通过 Constraints.Builder来创建该对象,并在调用WorkRequest.Builder的build()方法之前,将其传递 给WorkerRequest。

3 WorkManager
这个类用来安排和管理工作请求。前面创建的WorkRequest 对象通过WorkManager来安排的顺序。 WorkManager调度任务的时候会分散系统资源,做好类似负载均衡的操作,同时会遵循前面设置的对任务的约束条件。

4 WorkStatus
每一个WorkRequest都会有一个WorkStatus与之对应,里面包含了该任务的许多信息,可以通过WorkManager来获取包含WorkStatus的LiveData对象。开发者可以通过观察该LiveData对象来监听与之对应的任务所处的状态,并在任务完成后通过调用WorkStatus的getOutputData()方法获取返回值。

主要流程:

  1. 给WorkManager发送工作请求WorkRequest。
  2. WorkManager将该请求的相关参数放入WorkManager的数据库中。
  3. WorkManager根据设备版本、是否是前台任务等情况将请求操作传递给JobScheduler或者AlarmManager等部件。
  4. 检查Worker是否满足约束条件,当满足约束条件时调用执行Worker。

广播流程

解释说明:

最少轮询/循环一次 15分钟(Google规定的)一直都是 ENQUEUE状态,因为 你是轮询的任务看不到 SUCCESS

设置约束,WorkManger提供了以下的约束作为Work执行的条件:
         *  setRequiredNetworkType:网络连接设置
         *  setRequiresBatteryNotLow:是否为低电量时运行 默认false
         *  setRequiresCharging:是否要插入设备(接入电源),默认false
         *  setRequiresDeviceIdle:设备是否为空闲,默认false
         *  setRequiresStorageNotLow:设备可用存储是否不低于临界阈值

APK清单文件里面(第一次)执行(通过合并AndroidManifest.xml文件的<provider>标签在oncreate方法中完成第一次初始化)
         * 1.初始化 数据库 ROOM 来保存你的任务 (持久性保存的) 手机重新,APP被杀掉 没关系 一定执行
         * 2.初始化  new GreedyScheduler
         * 3.初始化 配置信息 configuration  (执行的信息,线程池任务,...)

面试题:WorkManager是干嘛用的?
答:处理非及时任务,举例子:每天同步一次数据到服务器,这种类似的需求,不是及时执行,但是又保证会执行的非及时任务。

面试官 接着问:WorkManager是怎么保证,当我把APP杀掉后呢?
答:记录用户的所有信息并全部保存到数据库,而并非保存在内存中,这样做的好处,就是持久性保存记录,所有APP被杀掉后 依然可以获取所有任务信息。

面试题:你研究过WorKManager源码,任务是怎么保证一定执行的呀?
答:Android操作系统会在系统级别服务中,来判断用户的约束条件,当约束条件满足时就会执行任务,但是触发检测是采用广播的形式处理的,例如:网络连接成功 就触发...。

WorkManager相关推荐

  1. 使用 WorkManager 管理后台和前台工作

    ​​ 随着设备性能提升和软件生态发展,越来越多的 Android 应用需要执行相对更复杂的网络.异步和离线等任务.例如用户想要离线观看某个视频,又不想一直停留在应用界面等待下载完成,那么就需要以一定的 ...

  2. Jetpack WorkManager的使用-完全解析

    谷歌官方API介绍 兼容范围广 Pangu-Immortal (Pangu-Immortal) · GitHub WorkManager最低能兼容API Level 14,并且不需要你的设备安装有Go ...

  3. WorkManager从入门到实践,有这一篇就够了

    作者 | Eason 来源 | 程序员巴士 前言 一般情况下,我们大部分的操作都是在app打开的时候进行的,但是在某些情况下,即使app关闭了,我们也可能需要执行必要的动作,或者会采取一个动作,而不是 ...

  4. 运行android程序时显示stop,Android系统.应用程序关闭时WorkManager是否正在运行?

    我想安排每晚数据库更新.所以我使用新的Android WorkManager.我的理解是,一旦安排它将始终独立于应用程序的生命周期在后台运行. 是对的吗?我的第一次测试显示Work只在应用程序运行时执 ...

  5. 【Jetpack】WorkManager

    [JetPack]WorkManager 转载自享学课堂-derry,非常感谢derry的讲解 WorkManager有什么用: 一:确保重要的后台任务,一定会被执行,后台任务(例如:非及时性的 (请 ...

  6. android 定时推送提醒,使用workManager实现每日定时推送通知

    写这篇博客的缘由来自一个需求: 每日定时推送通知,提醒用户完成签到.如果后台被清理,则在打开App后立即推送. 众所周知,如今的Android国产ROM想要实现定时操作需要做极强的保活.然而一旦做了保 ...

  7. WorkManager笔记: 二、管理工作

    文章目录 一.标记工作 二.输入输出数据 1.设置输入数据 2.设置输出数据 3.拿到输出结果 三.管理工作 1.唯一工作: 2.观察您的工作 3.取消和停止工作 四.观察工作器执行进度 五.Work ...

  8. WorkManager详解,【面试总结】

    override fun doWork(): Result { val A = inputData.getInt("A",0) val B = inputData.getStrin ...

  9. Android开发之定时任务(AlarmManager、WorkManager)

    Android 程序的定时任务主要有AlarmManager.WorkManager两种. 一.AlarmManager AlarmManager,又称闹钟,可以设置一次性任务,周期重复任务,定时重复 ...

最新文章

  1. Nginx(九)-- Nginx实际使用配置
  2. Windows下打包maven项目,编写bat脚本,dos命令在后台运行与关闭
  3. Java Script基础(九) 下拉列表对象
  4. 救命代码_救命! 如何选择功能?
  5. 谷粒商城RabbitMQ设计思想详解:消息队列双重保险设计
  6. oledb excel java_C#中Excel 2016的oledb连接字符串
  7. 02-再探MySQL数据库
  8. MongoDB Shell操作
  9. Java1.7之后Arrays.sort对数组排序DualPivotQuicksort.sort
  10. 2022年数据库云管平台白皮书
  11. 5.11 学习日记,首页banner做好了
  12. 计算机的代表性产品,电脑展回顾 十款最具代表性存储产品
  13. 了解SQL Server中NOLOCK和WITH NOLOCK表提示的影响
  14. [转载] python更新numpy_Python numpy从1.6更新到1.8
  15. mysql比较varchar值大小_Mysql varchar大小长度问题
  16. 30个专业的电子商务网站,助您一臂之力
  17. 【Python脚本进阶】2.4、conficker蠕虫(下):暴破口令,远程执行进程
  18. WGS84 与 北京54 坐标系互转
  19. 步步为营 SharePoint 开发学习笔记系列 二、安装和配置
  20. 安卓机器人+淘宝客介绍

热门文章

  1. nodejs mongodb
  2. 64位win7下安装SQL Server 2008(图文解说版)----本人备注
  3. Oracle表格误删,Oracle误删表空间文件
  4. 人工智能基础部分11-图像识别实战(网络层联想记忆,代码解读)
  5. spark中的转换算子和行动算子区别(transformations and actions)
  6. 实现单链表的就地逆置
  7. js判断APP和浏览器
  8. 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 python实现
  9. 李国杰披露AMD技术转让 只能看不能吃(全文版)
  10. 从没想过从上帝视角看地球,竟美得如此震撼!