Android WorkManager使用介绍

一、引言

  WorkManager 是google提供的异步执行任务的管理框架,是 Android Jetpack 的一部分,会根据手机的API版本和应用程序的状态来选择适当的方式执行任务。
  在后台执行任务的需求是非常常见的,Android也提供了多种解决方案,如JobScheduler、Loader、Service等,如果这些API没有被恰当使用,则可能会消耗大量电量。Android在解决应用程序耗电问题上做了各种尝试,从Doze到App Standby,通过各种方式限制和管理应用程序,以保证应用程序不会在后台消耗过多的设备电量。WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决方案,以便在设备电量和用户体验之间达到一个比较好的平衡

二、WorkManager特点

  • 针对的是不需要及时完成的任务
    例如,发送应用程序日志、同步应用程序数据、备份用户数据等,这些任务一般都不需要立即完成,如果我们自己来管理这些任务,逻辑可能会非常复杂,若API使用不恰当,可能会消耗大量电量。
  • 保证任务一定会执行
    WorkManager能保证任务一定会被执行,即使应用程序当前不在运行中,甚至在设备重启过后任务仍然会在适当的时刻被执行。WorkManager有自己的数据库,关于任务的所有信息和数据都保存在该数据库中。因此只要任务交给了WorkManager,哪怕应用程序彻底退出或者设备被重新启动,WorkManager依然能够保证完成任务。
  • 兼容范围广
    WorkManager最低能兼容API Level 14,并且不需要设备安装Google Play Services。因此,不用过于担心兼容性问题,因为API Level 14已经能够兼容几乎100%的设备了。

三、WorkManager兼容方案

  WorkManager能根据设备的情况,选择不同的执行方案。在API Level 23以上的设备中通过JobScheduler完成任务,在API Level 23以下的设备中,通过AlarmManager和Broadcast Receivers组合来完成任务。但无论采用哪种方案,任务最终都是由Executor来执行的。另外,WorkManager不是一种新的工作线程,它的出现不是为了替代其他类型的工作线程。工作线程通常立即运行,并在任务执行完成后给用户反馈,而WorkManager不是即时的,它不能保证任务能立即得到执行
兼容方案

四、WorkManager使用方法

1. 使用前的准备

导入依赖

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

dependencies {
   
    def work_version = "2.7.1"
    implementation "androidx.work:work-runtime:$work_version"
}

创建Activity

新建一个Activity,在其布局文件中放置一个按钮,作为任务的触发器。

2. 定义任务

新建一个MyWork类继承Worker类,重写dowork()方法,在其中添加希望由WorkManager 运行的工作任务。

import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
 
public class MyWork extends Worker {
   
 
    public MyWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
   
        super(context, workerParams);
    }
 
    @NonNull
    @Override
    public Result doWork() {
   
        //任务的具体行为
        Log.d("tag", "Work doWork");
        return Result.success();
    }
}

doWork()将返回执行结果Result,会通知WorkManager服务工作是否成功,以及工作失败时是否应重试工作。

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

3. 配置任务

任务通过WorkRequest在WorkManager中进行定义,为了使用WorkManager调度任务,需要先创建一个WorkRequest对象,将其加入队列。

//为任务创建WorkRequest对象
WorkRequest myWorkRequest = ...
//将任务请求加入队列
WorkManager workManager = WorkManager.getInstance(this);
workManager.enqueue(myWorkRequest);

其中,WorkRequest对象有两种类型:

  • OneTimeWorkRequest:只会执行一次的任务请求
  • PeriodicWorkRequest:将以周期形式反复执行的任务请求

WorkRequest对象包含WorkManager调度和运行工作所需的所有信息。其中包括运行工作必须满足的约束、调度信息(例如延迟或重复间隔)、重试配置,并且可能包含输入数据(如果工作需要),下面以一次性任务请求为例,介绍各种配置信息的定义方式与实际效果

设置任务触发条件

需要实例化一个Constraints对象指定任务运行的约束(触发条件),常用的约束类型如下:

类型 说明
NetworkType 约束运行工作所需的网络类型。例如 Wi-Fi (UNMETERED)
BatteryNotLow 如果设置为 true,那么当设备处于“电量不足模式”时,工作不会运行
RequiresCharging 如果设置为 true,那么工作只能在设备充电时运行
DeviceIdle 如果设置为 true,则要求用户的设备必须处于空闲状态,才能运行工作。在运行批量操作
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值