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 + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"

    // optional - RxJava2 support
    implementation "androidx.work:work-rxjava2:$work_version"

    // optional - GCMNetworkManager support
    implementation "androidx.work:work-gcm:$work_version"

    // optional - Test helpers
    androidTestImplementation "androidx.work:work-testing:$work_version"

    // optional - Multiprocess support
    implementation "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.WorkerParameters

class 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创建WorkRequest
        val mWorkerRequest : WorkRequest = OneTimeWorkRequestBuilder<MyWorker>()
        //                .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
            .build()

        //通过WorkManager提交WorkRequest,执行MyWorker
        WorkManager
            .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,执行MyWorker
        WorkManager
            .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,执行MyWorker
        WorkManager
            .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,执行MyWorker
        WorkManager
            .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 使用入门

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Volta简单介绍

Volta是一款强大的JavaScript工具管理器&#xff0c;它简化了命令行工具的安装和管理。通过Volta&#xff0c;开发者可以轻松地在多个项目中切换和配置Node.js、npm以及其它JavaScript工具版本&#xff0c;提高开发效率和环境一致性。 什么是 Volta Volta 是一种管理 JavaScri…

如何在公网环境使用固定域名远程访问内网BUG管理系统协同办公

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

056:vue工具 --- CSS在线格式化

第056个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

台湾虾皮本土店铺:如何在台湾虾皮本土店铺开展电商业务

在台湾地区&#xff0c;虾皮&#xff08;Shopee&#xff09;是一款备受欢迎的电商平台。虾皮拥有强大的技术团队、丰富的电商经验和对市场的深刻理解。虾皮本土店铺凭借其在出售、物流、回款、售后、仓储等方面的一条龙服务&#xff0c;为广大卖家提供了全方位的保障和支持。如…

【HCIP学习记录】OSPF之DD报文

1.OSPF报文格式 24字节 字段长度含义Version1字节版本&#xff0c;OSPF的版本号。对于OSPFv2来说&#xff0c;其值为2。Type1字节类型&#xff0c;OSPF报文的类型&#xff0c;有下面几种类型&#xff1a; 1&#xff1a;Hello报文&#xff1b;● 2&#xff1a;DD报文&#xff1…

人工智能解决方案工程师,究竟是个怎样的职业?

人工智能解决方案工程师是专注于利用人工智能技术为企业和组织提供解决方案的专业人员。 他们在人工智能技术的基础上&#xff0c;结合业务需求和场景&#xff0c;设计和开发定制化的智能系统&#xff0c;以解决特定的问题或优化业务流程。 人工智能解决方案工程师需要具备一系…

ros2 学习04 工作空间说明及示例

ros2 术语说明&#xff1a; 大家在学习其他的开发语言之前的学习和开发中&#xff0c;应该有接触过某些集成开发环境&#xff0c;比如Visual Studio、Eclipse、Qt Creator等&#xff0c;当我们想要编写程序之前&#xff0c;都会在这些开发环境的工具栏中&#xff0c;点击一个“…

win环境下启动kafka Port already in use: 6688; nested exception is

背景 zk启动成功后&#xff0c;接下来启动kafka&#xff0c;再启动kafka后一直说端口被占用。 端口占用解决办法: netstat -aon|findstr 9092 taskkill -f -pid 7780 杀掉后&#xff0c;再次启动kafka时&#xff0c;问题并未解决 后来修改了批处理文件kafka-run-class.bat中…

从零开始学习Web自动化:用Python和Selenium实现网站登录功能!

Web自动化测试实战项目&#xff1a;使用Selenium和Python完成网站登录功能的自动化测试 本文将介绍如何使用Selenium和Python编写自动化测试脚本&#xff0c;对网站登录功能进行测试。我们将通过模拟用户在网站上输入用户名和密码&#xff0c;并点击登录按钮&#xff0c;来检验…

测试工具Jmeter:设置中文界面

首先我们打开Jmeter所在的文件&#xff0c;进入bin目录&#xff0c;打开Jmeter.properties&#xff1a; 打开后找到languageen&#xff1a; 改为zh_CN: 保存关闭&#xff0c;然后再打开Jmeter&#xff1a; 英文并不会显得高级&#xff0c;能做到高效的性能测试才是高级的。

明理信息科技打造专属个人或企业知识付费平台,核心功能设计

在当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1…

宠物新手必读:5款公认性价比高的猫罐头测评

很多人在买猫罐头的时候&#xff0c;可是费了老鼻子劲儿了。他们浏览了各大平台&#xff0c;读了大量的评测文章&#xff0c;就想着找到最好的那一个。但最后他们发现&#xff0c;很多所谓的「实测」都是虚的&#xff0c;假的。花了几天时间&#xff0c;结果选了个垃圾猫罐头&a…

Elasticsearch——深入原理

在正式介绍Elasticsearch的具体功能以前&#xff0c;将介绍Elasticsearch中比较重要的原理与机制。这有助于理解Elasticsearch的内部机制&#xff0c;以及从表面功能深入了解其背后的逻辑本质。主要内容如下&#xff1a; 搜索引擎的基本原理和组成结构。Elasticsearch集群的形…

Java基础语法之内部类

什么是内部类 就是在一个类中又定义了另一个类 分类 实例内部类 即未被static修饰的内部类 1.外部类中的任何成员都可以在内部类里面直接访问&#xff0c;不管这个成员是什么权限 2.内部类对象的创建必须是在有外部类成员的前提下 这是错误的&#xff0c;那如何实例化呢&a…

个人熟悉C语言,准备学习嵌入式,用得上吗?

今日话题&#xff0c;准备学习嵌入式&#xff0c;熟悉C语言用得上吗&#xff1f;C语言具有高效的性能和接近硬件的特性&#xff0c;因此在嵌入式开发中有着广泛的应用&#xff0c;包括系统级编程和驱动程序开发等方面。实际上&#xff0c;C语言在嵌入式开发中扮演着非常关键的角…

八股文打卡day3——计算机网络(3)

面试题&#xff1a;请讲一下四次挥手的过程&#xff1f; 1.客户端发送FIN数据包给服务器&#xff0c;表示客户端不再发送数据给服务器&#xff0c;想要断开这个方向的连接。 2.服务器收到客户端的FIN包之后&#xff0c;发送ACK包给客户端&#xff0c;对收到的FIN包进行收到确认…

大数据机器学习-梯度下降:从技术到实战的全面指南

大数据机器学习-梯度下降&#xff1a;从技术到实战的全面指南 文章目录 大数据机器学习-梯度下降&#xff1a;从技术到实战的全面指南一、简介什么是梯度下降&#xff1f;为什么梯度下降重要&#xff1f; 二、梯度下降的数学原理代价函数&#xff08;Cost Function&#xff09;…

VueStu01-Vue是什么

1.概念 Vue 是一个 用于构建用户界面 的 渐进式 框架 。 2.构建用户界面 基于数据渲染出用户看到的页面。 3.渐进式 Vue的学习是循序渐进的&#xff0c;可以学一点用一点&#xff0c;不必全部学完才能用。哪怕你只学了 声明式渲染 这一个小部分的内容&#xff0c;你也可以完成…

商业加速终极指南:创业家的10个关键步骤

多年来&#xff0c;前沿的初创企业一直在塑造整个行业&#xff0c;引入新技术、更精简的业务模式以及深受客户喜爱的开箱即用的产品。这不仅仅是一种短暂的趋势&#xff0c;而是我们的商业格局发生了根本性的转变&#xff0c;在这种情况下&#xff0c;率先抓住新的增长机遇可以…

ubuntu无 root 权限安装 screen

网上的方法主要是如下图的方法&#xff0c;源码安装&#xff0c;但是我一直 make install失败显示没有权限 然后选择放弃&#xff0c;然后随便试了一下方法 2&#xff0c;成功 方法 1 方法 2 pip3 install screen结果&#xff1a;