美文网首页
Android-Jetpack-WorkManager的使用

Android-Jetpack-WorkManager的使用

作者: 阿博聊编程 | 来源:发表于2022-04-23 20:29 被阅读0次
配图来自网络,如侵必删

在日常的开发当中,我们肯定有后台执行任务的需求,使用旧的Android API会出现电耗消耗比较大的情况,甚至有可能出现被系统推荐优化的软件列表中。在Jetpack中,Android API给我们提供了WorkManager解决后台执行任务的需求,让用户体验和电量消耗达到一个平衡状态。这篇博客来分享一下WorkManager相关的知识,希望对看文章的小伙伴有所帮助。

WorkManager的优势

  • 针对的是不需要及时完成的任务。
  • 能保证任务一定会被执行。WorkManager有自己的数据库,关于任务的所有信息和数据都保存在该数据库中,不管是应用彻底退出还是手机重新启动,它都能完成你的任务。
  • 兼容的范围很广,最低能兼容到Android Level 14

WorkManager的兼容方案分析

WorkManager会根据设备的情况,执行不同的方案。情况分为:

  • 在API Level 23以上的设备中,通过JobScheduler完成任务;
  • 在API Level 23以下的设备中,通过AlarmManagerBroadcast Receivers组合来完成任务。

最后还是由Executor来执行。

WorkManager相关的依赖

Java版本的依赖:

implementation "androidx.work:work-runtime:2.7.1"

Kotlin+coroutines的依赖:

implementation "androidx.work:work-runtime-ktx:2.7.1"

RxJava2的依赖:

implementation "androidx.work:work-rxjava2:2.7.1"

简单的使用

场景是我们需要上传一份文件到服务器,创建一个UploadFileWorker类,代码如下:

import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters

class UploadFileWorker(context: Context, workerParams: WorkerParameters) :
    Worker(context, workerParams) {
    override fun doWork(): Result {
        return Result.success()
    }
}

Result有下面三种状态:

  1. 执行成功,Result.success();
  2. 执行失败,Result.failure();
  3. 需要重新执行,Result.retry()

WorkRequest配置任务

1.我们需要设置触发条件,可能是多个条件,代码如下:

val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED)
            .setRequiresCharging(true)
            .setRequiresBatteryNotLow(true)
            .build()

2.我们将任务触发条件设置到WorkRequest,代码如下:

val uploadWorkRequest: OneTimeWorkRequest =
            OneTimeWorkRequest.Builder(UploadFileWorker::class.java)
                .setConstraints(constraints).build()

3.如果你不想立即执行,可以基于上一段代码优化,代码如下:

val uploadWorkRequest: OneTimeWorkRequest =
            OneTimeWorkRequest.Builder(UploadFileWorker::class.java)
                .setInitialDelay(10,TimeUnit.MINUTES)
                .setConstraints(constraints).build()

4.给任务设置标签,方便后续观察,代码如下:

val uploadWorkRequest: OneTimeWorkRequest =
            OneTimeWorkRequest.Builder(UploadFileWorker::class.java)
                .setInitialDelay(10,TimeUnit.MINUTES)
                .addTag("UploadFileWorker")
                .setConstraints(constraints).build()

注意如果你想要通过Tag跟踪任务状态,可以调用WorkManager.getWorkInfosByTagLiveData(String tag);取消任务可以调用WorkManager.cancelAllWorkByTag(String tag)

5.将任务提交给系统处理,代码如下:

WorkManager.getInstance(this).enqueue(uploadWorkRequest)

观察任务的方法

  • WorkManager.getWorkInfosByTag().
  • WorkManager.getWorkInfoById().
  • WorkManager.getWorkInfosForUniqueWork()。

上面三种不是实时的获取,如果想要实时的获取可以调用下面几种方法:

  • WorkManager.getWorkInfosByTagLiveData().
  • WorkManager.getWorkInfoByIdLiveData().
  • WorkManager.getWorkInfosForUniqueWorkLiveData()

具体的获取代码如下:

 WorkManager.getInstance(this).getWorkInfoByIdLiveData(uploadWorkRequest.id)
            .observe(this) {
                // 任务的状态变化通知
            }

取消所有的任务

 WorkManager.getInstance(this).cancelAllWork()

相关文章

  • Android-Jetpack-WorkManager的使用

    在日常的开发当中,我们肯定有后台执行任务的需求,使用旧的Android API会出现电耗消耗比较大的情况,甚至有可...

  • iconfont的使用(下载使用)

    1、下载文件 2、在生命周期中引入项目 beforeCreate () { var domModule = ...

  • Gson的使用--使用注解

    Gson为了简化序列化和反序列化的过程,提供了很多注解,这些注解大致分为三类,我们一一的介绍一下。 自定义字段的名...

  • 记录使用iframe的使用

    默认记录一下----可以说 这是我第一次使用iframe 之前都没有使用过; 使用方式: 自己开发就用了这几个属...

  • with的使用

    下面例子可以具体说明with如何工作: 运行代码,输出如下

  • this的使用

    什么是this? this是一个关键字,这个关键字总是返回一个对象;简单说,就是返回属性或方法“当前”所在的对象。...

  • this的使用

    JS中this调用有几种情况 一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象...

  • ==的使用

    积累日常遇到的编码规范,良好的编码习惯,持续更新。。。 日常使用==用于判断的时候,习惯性将比较值写前面,变量写后...

  • this的使用

    1.默认绑定,就是函数立即执行。 函数立即执行就是指向window,但是如果是node环境,就是指向全局conso...

  • %in% 的使用

    写在前面:From 生信技能书向量难点之一:%in% 难点 (1)== 与 %in% 的区别== 强调位置,x和对...

网友评论

      本文标题:Android-Jetpack-WorkManager的使用

      本文链接:https://www.haomeiwen.com/subject/wptzertx.html