我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android开发Jetpack组件WorkManager怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android开发Jetpack组件WorkManager怎么用

这篇文章主要介绍“Android开发Jetpack组件WorkManager怎么用”,在日常操作中,相信很多人在Android开发Jetpack组件WorkManager怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发Jetpack组件WorkManager怎么用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、简介

    WorkManager 用于处理 Android 后台任务。我们只需要设置好任务内容、何时执行,剩下的工作就可以完全交给系统处理。它会自动向下兼容,在不同的 Android 版本上采用不同的实现方案。

    由于是交给系统调度的,它可以保证应用退出甚至手机重启后,任务依然能够得到执行。WorkManager 很适合执行一些定期和服务器交互的任务,比如周期性的同步数据等等。并且,WorkManager 还支持周期性任务、链式任务。

    需要注意的是,WorkManager 不能保证任务一定能够准时执行,这是因为系统为了减少电量消耗,会将触发事件临近的几个任务放在一起执行,以减少 CPU 被唤醒的次数,延长电池使用时间。

    另外,在国产手机上 WorkManager 可能无法正常运行,这是因为绝大多数手机厂商定制 Android 系统时,会添加一个“一键关闭”的功能,这样被杀死后的应用程序,既无法接收广播,也不能运行 WorkManager 的后台任务。国产手机增加此功能也是迫于无奈,主要是因为市面上有太多的恶意应用想要霸占后台。所以,我们在国产手机上不要使用 WorkManager 去实现核心功能。

    二、导入

    在 app/build.gradle 中添加依赖:

    implementation 'androidx.work:work-runtime:2.3.2'

    三、基本使用

    WorkManager 的用法分为三步:

    • 定义一个后台任务

    • 配置任务运行条件

    • 将任务传给 WorkManager

    3.1 定义后台任务

    创建一个 SimpleWorker 类,继承自 Worker:

    class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) {    override fun doWork(): Result {        Log.d("~~~", "do something")        return Result.success()    }}

    Result.success()表示任务执行成功

    Result.failure() 表示任务执行失败

    Result.retry() 表示任务需要重试。这个方法需要配合任务重试配置一起使用

    3.2 配置任务运行条件

    3.2.1 只需执行一次的任务

    使用 OneTimeWorkRequest 构建只需执行一次的任务

    val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java).build()
    3.2.2 周期性执行的任务

    使用 PeriodicWorkRequest 构建周期性执行的任务

    val request = PeriodicWorkRequest.Builder(SimpleWorker::class.java, 15, TimeUnit.MINUTES).build()

    为了减少耗电量,PeriodicWorkRequest 要求任务执行周期不得短于十五分钟,查看源码可以发现,如果传入的值短于十五分钟,系统会打印一条警告,然后自动将周期设置成十五分钟:

    public static final long MIN_PERIODIC_INTERVAL_MILLIS = 15 * 60 * 1000L; // 15 minutes.public void setPeriodic(long intervalDuration) {    if (intervalDuration < MIN_PERIODIC_INTERVAL_MILLIS) {        Logger.get().warning(TAG, String.format(                "Interval duration lesser than minimum allowed value; Changed to %s",                MIN_PERIODIC_INTERVAL_MILLIS));        intervalDuration = MIN_PERIODIC_INTERVAL_MILLIS;    }    setPeriodic(intervalDuration, intervalDuration);}

    3.3 将任务传给 WorkManager

    WorkManager.getInstance(this).enqueue(request)

    这就是 WorkManager 的基本使用。

    四、高级配置

    4.1 设置任务延迟执行

    通过 setInitialDelay 方法设置延迟时间

    val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java)   .setInitialDelay(5, TimeUnit.MINUTES)   .build()

    4.2 给任务添加标签

    通过 addTag 方法添加标签:

    val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java)    .addTag("simple")    .build()

    添加标签的作用是,方便我们根据标签取消任务。

    4.3 取消任务

    4.3.1 根据标签取消任务
    WorkManager.getInstance(this).cancelAllWorkByTag("simple")
    4.3.2 根据 request 的 id 取消任务
    WorkManager.getInstance(this).cancelWorkById(request.id)
    4.3.3 取消所有任务
    WorkManager.getInstance(this).cancelAllWork()

    4.4 任务重试

    通过 setBackoffCriteria 配置任务重试:

    val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java)    .setBackoffCriteria(BackoffPolicy.LINEAR, 10, TimeUnit.SECONDS)    .build()

    前文说到,Result.retry() 表示任务需要重试,这个方法需要配合任务重试配置一起使用。任务重试配置就是指这个 setBackoffCriteria 方法,它传入了三个值,第二个值和第三个值表示重试时间配置。第一个值表示重试延迟的形式,有两个值可供选择:

    • BackoffPolicy.LINEAR 重试时间每次呈线性增长,按照此例中的配置,每次重试时间就是 10s,20s,30s,40s&hellip;

    • BackoffPolicy.EXPONENTIAL 重试时间每次呈指数级增长,按照此例中的配置,每次重试时间就是 10s,20s,40s,80s&hellip;

    4.5 监听任务结果

    WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.id).observe(this) {    Log.d("~~~", "state = ${it.state}, tags = ${it.tags.toList()}")    when (it.state) {        WorkInfo.State.SUCCEEDED -> Log.d("~~~", "success")        WorkInfo.State.FAILED -> Log.d("~~~", "fail")        WorkInfo.State.RUNNING -> Log.d("~~~", "running")        WorkInfo.State.ENQUEUED -> Log.d("~~~", "enqueued")        WorkInfo.State.CANCELLED -> Log.d("~~~", "cancelled")        WorkInfo.State.BLOCKED -> Log.d("~~~", "blocked")    }}

    首先通过 getWorkInfoByIdLiveData 获得任务信息的 LiveData<WorkInfo> 数据,然后观察此数据即可。也可以通过 getWorkInfosByTagLiveData 获得相同 Tag 的 LiveData<List<WorkInfo>>,观察这个任务信息列表。通过 WorkInfo 的 getState 方法获取任务状态,主要用到的状态有 WorkInfo.State.SUCCEEDED 和 WorkInfo.State.FAILED,标志着任务的成功和失败。

    4.6 传递数据

    val request = OneTimeWorkRequest.Builder(SimpleWorker::class.java)    .setInputData(Data.Builder().apply {        putString("key", "value")    }.build())    .build()

    SimpleWorker 类中读取此数据:

    inputData.getString("key")

    4.7 链式任务

    val first = OneTimeWorkRequest.Builder(SimpleWorker::class.java)    .build()val second = OneTimeWorkRequest.Builder(SimpleWorker::class.java)    .build()val third = OneTimeWorkRequest.Builder(SimpleWorker::class.java)    .build()WorkManager.getInstance(this)    .beginWith(first)    .then(second)    .then(third)    .enqueue()

    通过 beginWith 发起链式任务,然后后缀 then 即可,任务会按照连接顺序依次执行。WorkManager 要求必须在上一个任务执行成功后,才会执行下一个任务。也就是说任何一个任务的失败都会导致链式任务的中断。

    到此,关于“Android开发Jetpack组件WorkManager怎么用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Android开发Jetpack组件WorkManager怎么用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Android开发Jetpack组件WorkManager怎么用

    这篇文章主要介绍“Android开发Jetpack组件WorkManager怎么用”,在日常操作中,相信很多人在Android开发Jetpack组件WorkManager怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
    2023-06-29

    Android Jetpack库重要组件WorkManager的使用

    WorkManager是Android Jetpack的一个强大的组件,用于处理后台耗时任务。后台任务可以是一次性的,也可以是重复的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-11-13

    Android开发Jetpack组件Room怎么用

    这篇文章主要讲解了“Android开发Jetpack组件Room怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android开发Jetpack组件Room怎么用”吧!一、简介Room
    2023-06-29

    Android开发Jetpack组件ViewModel使用讲解

    这篇文章主要介绍了AndroidJetpack架构组件ViewModel详解,ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在,ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。感兴趣可以来学习一下
    2022-11-13

    Android开发Jetpack组件Room使用讲解

    Room是一个数据库访问组件;对SqLite数据库做了友好的封装,使我们在编码的时候,只需要注重逻辑的部分即可,数据库就交给Room去流畅的访问即可
    2022-11-13

    Android Jetpack组件Lifecycle怎么使用

    本文小编为大家详细介绍“Android Jetpack组件Lifecycle怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android Jetpack组件Lifecycle怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
    2023-07-05

    android jetpack组件有什么作用

    Android Jetpack是一套用于帮助开发者构建高质量、稳定和高效Android应用程序的库集合。它提供了一系列的组件,帮助开发者简化常见的开发任务,加速开发过程。Android Jetpack组件的作用如下:1. Lifecycle
    2023-10-20

    【Android】Jetpack全组件实战开发短视频应用App(六)

    前言 这一篇我们主要介绍下Room数据库的创建以及简单使用 Room介绍 Room是Google为了简化SQLite推出的 拥有SQLite所有的操作功能; 使用简单,通过注解方式实现功能,类似Retrofit,编译时自动生成实现类 与Li
    2022-06-06

    【Android】Jetpack全组件实战开发短视频应用App(四)

    前言 我们在上一篇基本上已经实现我们要的效果了,但是还遗留了几个问题,这一篇我们就来解决下 自定义解析器 我们上一篇介绍过NavDestination是通过解析xml生成的,我们不想在xml中写死,通过注解的方式实现,我们接下来就自定义注解
    2022-06-06

    【Android】Jetpack全组件实战开发短视频应用App(三)

    前言 这一篇我们将使用Navigation搭建我们App的基础架构,我们先看下效果Navigation介绍 官网地址 快速入门 导航组件由以下三个关键部分组成: 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单
    2022-06-06

    【Android】Jetpack全组件实战开发短视频应用App(十)

    前言 我们已经把首页列表的Item布局完成,接下来我们就开始加载首页数据,我们这一篇主要是做封装,具体网络请求放在下一篇 引入依赖 //刷新分页组件 api 'com.scwang.smartrefresh:SmartRefreshLayo
    2022-06-06

    Android Jetpack 从使用到源码深耕【调度任务组件WorkManager 从实践到原理 】(三)

    本文,是Jetpack 调度任务组件WorkManager 从实践到原理系列文章的最后一篇,本文我们将对WorkManager 任务的具体执行源码,进行深入的解读。 大家坐好,我们要开始飙车了。 1.任务的具体执行 书接上文,我们既
    2023-08-18

    Android开发中Flutter组件怎么用

    这篇“Android开发中Flutter组件怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android开发中Flut
    2023-06-30

    Android Jetpack 从使用到源码深耕【调度任务组件WorkManager 从实践到原理 】(一)

    本文,我们对Jetpack的调度任务组件WorkManager ,由使用入手,对其源码进行深入学习、总结一下。 1.问题 研究这个框架之前,我们基于自己已有的知识体系,想一些问题,给自己设定一些目标,带着目标和问题,去阅读这块的源码,相信收
    2023-08-17

    Android开发之BottomSheetDialog组件的使用

    BottomSheetDialog是底部操作控件,可在屏幕底部创建一个支持滑动关闭视图。本文将通过示例详细讲解它的使用,感兴趣的小伙伴可以了解一下
    2023-01-09

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录