Android开发Jetpack组件WorkManager用例详解

Android开发Jetpack组件WorkManager用例详解

目录

一、简介

二、导入

三、基本使用

3.1 定义后台任务

3.2 配置任务运行条件

3.2.1 只需执行一次的任务

3.2.2 周期性执行的任务

3.3 将任务传给 WorkManager

四、高级配置

4.1 设置任务延迟执行

4.2 给任务添加标签

4.3 取消任务

4.3.1 根据标签取消任务

4.3.2 根据 request 的 id 取消任务

4.3.3 取消所有任务

4.4 任务重试

4.5 监听任务结果

4.6 传递数据

4.7 链式任务

一、简介

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. /** * Sets the periodic interval for this unit of work. * * @param intervalDuration The interval in milliseconds */ 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…

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

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用例详解的详细内容,更多关于Android Jetpack组件WorkManager的资料请关注易知道(ezd.cc)其它相关文章!

推荐阅读

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    酷睿I7 配置

    酷睿I7 配置,配置,玩家国度啦华硕 Rampage II Extreme(3800元)如果米不够,也可以把Extreme改为Gene,不过是小板内存推荐金士顿6G DDR3 2000骇

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    查看配置:酷睿i3530集展示办公平台

    查看配置:酷睿i3530集展示办公平台,,由于时间和精力的关系,我们不可能对所有的配置进行评论,希望我们能理解,我希望我们的评论能在那些需要帮

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    wps中ppt如何取消声音

    wps中ppt如何取消声音,WPS教程,1.ppt的声音怎么去掉去掉PPT中的背景音乐的几种方法:方法一:删掉小喇叭1、打开PPT,在页面上找一找小喇叭,选中