Android WorkManager入门(一)

WorkManager入门

  • 前言
  • 一、WorkManager是什么?
  • 二、使用
    • 1.添加依赖
    • 2.定义工作
    • 3.创建 WorkRequest并提交 一次性的任务(OneTimeWorkRequest)
    • 4.setExpedited 加急方法
    • 5. setInitialDelay 延时任务
    • 6.约束
  • 总结
  • 参考资料


前言

在当今快节奏的生活中,移动设备已经成为我们日常工作和生活不可或缺的一部分。然而,随着应用程序的复杂性不断增加,开发人员面临着一个重要的挑战:如何在后台执行任务,而不会影响用户的体验和设备的性能?
在过去,开发人员通常使用传统的后台服务或定时任务来解决这个问题。然而,这些方法往往很复杂,需要大量的代码和资源,并且很难管理和调度任务。幸运的是,谷歌最近推出了一个新的解决方案:安卓WorkManager。
安卓WorkManager是一个灵活、强大的后台任务调度库,旨在帮助开发人员轻松管理和执行后台任务。它提供了一种简单的方式来调度任务,无论是一次性任务、定期任务还是延迟任务,都可以很容易地实现。同时,WorkManager还提供了一系列强大的功能,如任务链、约束条件和灵活的重试机制,以确保任务能够在最佳的时间和条件下执行。
在本文中,我们将深入探讨安卓WorkManager的原理和用法,并通过实际示例演示如何使用它来解决常见的后台任务问题。无论您是一名初学者还是一名有经验的开发人员,本文都将为您提供宝贵的知识和实用的技巧,帮助您更好地利用安卓WorkManager来优化您的应用程序。让我们一起开始这段关于安卓WorkManager的探索之旅吧!

好吧,不多BB,其实是因为安卓12以上想起后台服务必须要悬浮窗权限,想起还有个WorkManager这种东西,去官网学习然后总结一下。


一、WorkManager是什么?

我们先copy一下官方的解释 ,借鉴,借鉴,读书人的事怎么能叫抄
对于WorkManager,官方是这样描述的:
WorkManager 是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是持久性的工作。由于大多数后台处理操作都是通过持久性工作完成的,因此 WorkManager 是适用于后台处理操作的主要推荐 API。

用人话来简单描述解释一下就是说:应用后台操作,现在安卓官方推荐使用WorkManager了,官方还给了一张WorkManager与延时后台任务的关系图便于我们理解

在这里插入图片描述

我翻译了一下有些不太准,凑合着看吧

类型周期使用方式
立即(马上执行)一次性OneTimeWorkRequest 和 Worker。如需处理加急工作,请对 OneTimeWorkRequest 调用 setExpedited()。
可延期(延期执行)一次性或定期PeriodicWorkRequest 和 Worker。
长期运行(满足条件执行)一次性或定期任意 WorkRequest 或 Worker。在工作器中调用 setForeground() 来处理通知。

二、使用

1.添加依赖

写下这篇文章时的最新依赖是 2023 年 2 月 8 日的 2.8.0 版本

将以下依赖项添加到应用的 build.gradle 文件中:

dependencies {def work_version = "2.8.0"// (Java only)implementation "androidx.work:work-runtime:$work_version"// Kotlin + coroutinesimplementation "androidx.work:work-runtime-ktx:$work_version"// optional - RxJava2 supportimplementation "androidx.work:work-rxjava2:$work_version"// optional - GCMNetworkManager supportimplementation "androidx.work:work-gcm:$work_version"// optional - Test helpersandroidTestImplementation "androidx.work:work-testing:$work_version"// optional - Multiprocess supportimplementation "androidx.work:work-multiprocess:$work_version"
}

具体来说,上述配置包括以下依赖项:

  1. androidx.work:work-runtime:用于Java项目的基本依赖项。
  2. androidx.work:work-runtime-ktx:用于Kotlin项目的基本依赖项,结合协程使用。
  3. androidx.work:work-rxjava2:可选的依赖项,用于支持使用RxJava2编写任务。
  4. androidx.work:work-gcm:可选的依赖项,用于支持使用GCMNetworkManager调度任务(API级别低于23的设备)。
  5. androidx.work:work-testing:可选的依赖项,用于编写测试辅助工具。
  6. androidx.work:work-multiprocess:可选的依赖项,用于支持任务在多进程中运行。

2.定义工作

在具体使用时,我们需要先定义工作,我们先创建一个MyWorker类,继承woker,注意不要导错包。

写好后应该是这个样子的

import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParametersclass MyWorker(appContext: Context, workerParams: WorkerParameters):Worker(appContext, workerParams) {companion object{private const val TAG = "MyWorker"}override fun doWork(): Result {Log.d(TAG, "doWork: 我正在做一些工作")return Result.success()}}

在doWork()这个方法中,我们可以进行一系列操作,像是下载图片啊,更新安装包啊,都是可以的,方法需要一个Result 回参,我们看看Result 这个类


我们再借鉴一下官方的说法:
从 doWork() 返回的 Result 会通知 WorkManager 服务工作是否成功,以及工作失败时是否应重试工作。

  • Result.success():工作成功完成。
  • Result.failure():工作失败。
  • Result.retry():工作失败,应根据其重试政策在其他时间尝试。

所以示例中的return Result.success()就表示工作执行成功了

3.创建 WorkRequest并提交 一次性的任务(OneTimeWorkRequest)

示例嘛,我们就在activity中调用WorkRequest了,在activity的onCreate()方法中调用如下代码:

import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkRequest//通过OneTimeWorkRequestBuilder创建WorkRequestval mWorkerRequest : WorkRequest = OneTimeWorkRequestBuilder<MyWorker>()//                .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST).build()//通过WorkManager提交WorkRequest,执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest)

运行后可以在logcat中看到如下日志:
在这里插入图片描述

2023-12-19 11:13:46.675 31499-31570 MyWorker                com.example.test                     D  doWork: 我正在做一些工作
2023-12-19 11:13:46.684 31499-31541 WM-WorkerWrapper        com.example.test                     I  Worker result SUCCESS for Work [ id=9012bb3b-ccbb-4bbe-8e1c-1c84264410fb, tags={ com

对于这种简单的只需要执行一次的任务,推荐我们使用静态的方式创建

        //通过静态方式创建的val mWorkerRequest1 = OneTimeWorkRequest.from(MyWorker::class.java)//通过WorkManager提交WorkRequest,执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest1)

同样会输出以下日志

2023-12-19 11:18:16.519 32612-32682 MyWorker                com.example.test                     D  doWork: 我正在做一些工作
2023-12-19 11:18:16.533 32612-32663 WM-WorkerWrapper        com.example.test                     I  Worker result SUCCESS for Work [ id=5cfd14e8-791f-4b31-968c-c5404963ebba, tags={ com.example.test.MyWorker } ]

缺点呢就是不能进行其他灵活的配置,比如加急,延时和添加约束。

下面介绍的setXXX方法都是WorkRequest的衍生方法,使用需要在.build()方法前

4.setExpedited 加急方法

如果有多个任务,我们还可以使用setExpedited方法对任务进行加急,我们来看看源码
先看看setExpedited方法:

这个方法表示为任务请求加急的意思,需要一个OutOfQuotaPolicy入参,我们来看看OutOfQuotaPolicy类

从上面的源码来看我们只有一个任务时,设置.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)与不设置是等价的。而设置了加急的任务我们怎么知道是被加急了呢?在某些安卓设备上我们能收到通知,这与设备厂商和安卓版本有关。如果能收到的话我们创建Worker时使用CoroutineWorker,并集成其getForegroundInfo方法,然后,在 doWork() 内将其传递给 setForeground()。这样做会在 Android 12 之前的版本中创建通知。

您应该将 setForeground() 封装在 try/catch 块中,以捕获可能出现的 IllegalStateException。如果您的应用此时无法在前台运行,便可能会发生这类异常。在 Android 12 及更高版本中,您可以使用更详细的 ForegroundServiceStartNotAllowedException。

5. setInitialDelay 延时任务


下面这段代码表示会延迟十分钟再执行。

        val mWorkerRequest2 = OneTimeWorkRequestBuilder<MyWorker>().setInitialDelay(10, TimeUnit.MINUTES).build()//通过WorkManager提交WorkRequest,执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest2)

执行工作器的确切时间还取决于 WorkRequest 中使用的约束和系统优化方式。WorkManager 经过设计,能够在满足这些约束的情况下提供可能的最佳行为。

6.约束

上面的注意事项提到了约束,及一些特定的条件,android也帮我们归纳好了:

约束名称约束作用
NetworkType约束运行工作所需的网络类型。例如 Wi-Fi (UNMETERED)。
BatteryNotLow如果设置为 true,那么当设备处于“电量不足模式”时,工作不会运行。
RequiresCharging如果设置为 true,那么工作只能在设备充电时运行。
DeviceIdle如果设置为 true,则要求用户的设备必须处于空闲状态,才能运行工作。在运行批量操作时,此约束会非常有用;若是不用此约束,批量操作可能会降低用户设备上正在积极运行的其他应用的性能。
StorageNotLow如果设置为 true,那么当用户设备上的存储空间不足时,工作不会运行。

那么这些约束要怎么使用呢?

比如我们要在充电时做一些工作,就可以这样写

        val constraints = Constraints.Builder().setRequiresCharging(true).build()val mWorkerRequest3 = OneTimeWorkRequestBuilder<MyWorker>().setConstraints(constraints).build()//通过WorkManager提交WorkRequest,执行MyWorkerWorkManager.getInstance(this).enqueue(mWorkerRequest3)

因为我是USB充电调试,日志输出为

2023-12-19 13:22:14.597 27819-27906 MyWorker                com.example.test                     D  doWork: 我正在做一些工作
2023-12-19 13:22:14.616 27819-27870 WM-WorkerWrapper        com.example.test                     I  Worker result SUCCESS for Work [ id=c3898a3d-13d1-4dc5-86e4-234f282dfcec, tags={ com.example.test.MyWorker } ]

总结

本文主要介绍了WorkManager的一些基础使用,未完期待…

参考资料

WorkManager API
使用 WorkManager 调度任务
官方GitHub 代码示例
WorkManager 使用入门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/233761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

袋鼠目标检测数据集VOC+YOLO格式1400多张

袋鼠是双门齿目袋鼠亚目袋鼠科大袋鼠属的哺乳动物。袋鼠跳得最高、最远。雌性袋鼠都长有一个前开的育儿袋&#xff0c;袋鼠也因此得名。 [8]袋鼠泛指任一种属于袋鼠目的有袋动物&#xff0c; [7]它头小眼大耳朵长&#xff0c;面部较长&#xff0c;鼻孔两侧有黑色须痕。袋鼠胆小…

java --- 多线程

目录 一、java多线程的三种实现方式 1.1 多线程的第一种实现方式&#xff1a;继承Thread类 1.2 多线程的第二种实现方式&#xff1a;Runnable接口 1.3 多线程的第三种实现方式&#xff1a;Callable接口和Future接口 1.3 多线程三种实现方式的对比 二、线程常用的成员方…

<软考>软件设计师-5计算机网络(总结)

1 网络功能和分类 1-1计算机网络的功能 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。计算机网络的功能:数据通信、资源共享、负载均衡、高可靠性。 1-2计算机网络按分布范围划分 1-3网络的拓扑结构 总线型&#xff0…

深度学习环境配置------windows系统(GPU)------Pytorch

深度学习环境配置------windows系统&#xff08;GPU&#xff09;------Pytorch 准备工作明确操作系统明确显卡系列 CUDA和Cudnn下载与安装1.下载2.安装 环境配置过程1.安装Anacoda2.配置环境1&#xff09;创建一个新的虚拟环境2&#xff09;pytorch相关库的安装 2.安装VScode1&…

C# Tcplistener,Tcp服务端简易封装

文章目录 前言相关文章前言设计代码简单使用运行结果 前言 我最近有个需求要写Tcp服务端&#xff0c;我发现Tcp服务端的回调函数比较麻烦&#xff0c;简化Tcp的服务&#xff0c;我打算自己封装一个简单的Tcp服务端。 相关文章 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient…

ZLMediaKit的转流流程

zlmediakit的优势就是支持多种媒体容器和媒体协议。我从推流和拉流的两个角度&#xff0c;梳理出了转流的核心骨架。 推流 协议和容器格式的转换&#xff0c;最基本的内核就是音视频数据的扭转。对视频而言就是&#xff0c;解封装帧数据&#xff0c;组帧&#xff0c;封装帧。…

OpenHarmony 启动流程优化

目前rk3568的开机时间有21s&#xff0c;统计的是关机后从按下 power 按键到显示锁屏的时间&#xff0c;当对openharmony的系统进行了裁剪子系统&#xff0c;系统app&#xff0c;禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(五)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

butterfly蝴蝶分类

一、分类原因 由于植物分类所使用的数据集存在一定问题&#xff0c;修改起来比较麻烦&#xff0c;本次采用kaggle的ButterflyMothsImageClassification数据集&#xff0c;对100这种蝴蝶进行分类。 二、100中蝴蝶类别 ‘ADONIS’,‘AFRICAN GIANT SWALLOWTAIL’,‘AMERICAN S…

基于ssm高校推免报名系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把高校推免报名管理与现在网络相结合&#xff0c;利用java技术建设高校推免报名管理系统&#xff0c;实现高校推免报名的信息化。则对于进一步提高高校推免报名管理发展&#xff0c;丰富高校推免报名管理经验能起到不少的促进作用。…

Tomcat 部署论坛

一、安装好mysql数据库和jdk之后 开始部署论坛 用Navicat Premium 15连接mysql数据库并创建jforum数据库 下载版本 点击安装选择minninum点击下一步 点击一下一步 选择默认安装路径 安装验证&#xff0c;在安装完毕且启动Apache Tomcat&#xff0c;通过浏览器访问tomcat的80…

【QT】非常简单的登录界面实现

本系列是作者自学实践过程的记录 本文是关于登录界面设计 有问题欢迎讨论 效果图&#xff1a; 一、创建项目和主界面 创建Qt Widget Application 这里我们使用qmake而不是cmake 这是主界面&#xff0c;登录界面等后面再创建&#xff0c;这里要勾选上generate form&#xff0…

如何提高React组件的渲染效率的?在React中如何避免不必要的render?

面试官&#xff1a;说说你是如何提高组件的渲染效率的&#xff1f;在React中如何避免不必要的render&#xff1f; 一、是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合&#xff0c;实现了对 DOM 最小粒度的更新&#xff0c;大多数情况下&#xff0c;React 对 DOM 的渲染…

RocketMQ系统性学习-SpringCloud Alibaba集成RocketMQ以及消费收发实战

文章目录 Spring Cloud Alibaba 集成 RocketMQ 最佳实践集成依赖DashBoard消息收发实战 Spring Cloud Alibaba 集成 RocketMQ 最佳实践 SpringBoot 相对于 SSM 来说已经很大程度上简化了开发&#xff0c;但是使用 SpringBoot 集成一些第三方的框架&#xff0c;还是需要花费一些…

Seata使用详解

分布式事务介绍分布式事务的优缺点CAP理论介绍Base理论介绍CAP和BASE之间有什么区别Seata介绍Seata支持的事务模式介绍Seata的架构Seata应用场景Seata集群部署Seata集群部署的优缺点Seata在Java中的使用案例Seata在Java中的代码示例Seata与SpringBoot2.x的整合Seata与SpringBoo…

SpringIOC之BeanExpressionContextAccessor

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

NXP应用随记(六):S32K3xx的时钟与PIN简介

目录 1、S32K3基础时钟 1.1、关键功能 1.2、时钟产生模块 1.3、系统时钟 1.4、模式输入模块 1.5、时钟监控模块 2、S32DS时钟与外设配置工具 2.1、创建一个PIT模块 3、IO配置 3.1、IO资源分析 3.2、IO配置工具 1、S32K3基础时钟 S32K3有五个时钟源 1、快速内部 RC 晶…

0基础学java-day22(多用户即时通信系统)

一、QQ 聊天项目演示 聊天通讯系统 在运运行过程出现的异常&#xff0c;应该是类的序列化不一致导致的 1 项目 QQ 演示 2 为什么选择这个项目 只做核心部分&#xff0c;界面相对弱化 3 项目开发流程 3.1 需求分析 3.2 界面设计 3.2.1 用户登录 3.2.2 拉取在线用户列表 …

【C++】对象特性:无参有参构造函数,拷贝构造函数,析构函数

目录 对象的初始化和清理1.1 构造函数和析构函数1.2 构造函数的分类及调用1.3 拷贝构造函数调用时机1.4 构造函数调用规则1.5 深拷贝与浅拷贝 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置&#xff0c;在某一天我们不用时候也会删除一些自己信息数据保证安全。…

再看参数校验

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 写一个接口&#xff0c…