workmanager使用

2,358 阅读2分钟

以前主流的包活是通过service相互守护,发送心跳广播,alarmmanager,jobshedue来进行实现,当前google推出了workmannager,他可以自主根据api版本和实际情况选择不同方式,最低支持api14可以省去繁琐的保护代码,几乎可以替换service的作用。当前最高版本是androidx.work:work-runtime:2.2.0,需要迁移到androidx

  • 在运行 API 23 及以上级别的设备上使用 JobScheduler
  • 在运行 API 14-22 的设备上结合使用 BroadcastReceiver 和 AlarmManager
    workmanager只要当前app存在workmanager会一直持续执行,亲测起码两天没毛病。其基础使用如下
//新建一个继承Worker的类
public class Mywork extends Worker {
    public Mywork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        //真正需要执行的事
        doSomthing();
        /**
         * 返回值一共有五种
         * 基础的有是三种
         * Result.success()
         * Result.retry()
         * Result.failure()
         * 剩下两种是带有输出数据
         * Result.success(Data outputData)
         * Result.failure(Data outputData)
         */
        return Result.success();
    }
    public void doSomthing(){
        
    }
}
   /**
     *构建一个请求,一共有两种请求,一种是只执行一次的OneTimeWorkRequest
     */
    OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(Mywork.class).build();
    /**
     *另一种是循环执行的PeriodicWorkRequest,循环执行需要配置时间间隔和时间单位,但是时间间隔不能无限小,根据源码最小间隔为15分钟。
     *      
     */
    PeriodicWorkRequest workRequest =new PeriodicWorkRequest.Builder(Mywork.class, 1, TimeUnit.HOURS).build();
    
    WorkManager.getInstance(this).enqueue(workRequest);

以上几步就是最基础的操作和注释。在实际使用的时候我用的循环请求,但是我发现你即使覆盖安装,以前的workmanager还是会存在,虽然workmanager的耗费较小但是这个效果并不符合预期,因此更加深入的了解了一下发现可以使用唯一的request。

        /**
         * 个主要新添加了两个参数,一个是唯一性标识,另一个是已存在的的request的规则
         * 规则有两个
         * ExistingPeriodicWorkPolicy.KEEP 保持原来
         * ExistingPeriodicWorkPolicy.REPLACE 替换
         *这个是PeriodicWorkRequest
         */
        WorkManager.getInstance(this).enqueueUniquePeriodicWork("id", ExistingPeriodicWorkPolicy.KEEP,workRequest);
        /**
         * 有多个规则
         * KEEP 保持原来
         * APPEND 追加
         * REPLACE 替换
         * 这个是OneTimeWorkRequest
         */
        WorkManager.getInstance(this).enqueueUniqueWork("id", ExistingWorkPolicy.APPEND,oneTimeWorkRequest);

这些知识可以实现大部分的功能,但是还不能形成完整的制体系,因此对没有用到的知识也需要做一下整理。分为以下模块:

  1. 添加约束条件(这个主要是指定在某种状态下进行操作)
    Constraints constraints =  new  Constraints.Builder().setRequiresBatteryNotLow(true).build();
    PeriodicWorkRequest workRequest =new PeriodicWorkRequest.Builder(Mywork.class, 1, TimeUnit.HOURS)
                                        .setConstraints(constraints)
                                        .build();

除了在设置在电量不低的情况下进行操作还有如下的约束条件

  • setRequiresCharging(boolean requiresCharging)设置在充电时进行
  • setRequiresDeviceIdle(boolean requiresDeviceIdle)是否空闲
  • setRequiredNetworkType(@NonNull NetworkType networkType)设置某种网络类型
  • setRequiresStorageNotLow(boolean requiresStorageNotLow)存储不低的情况下