jetpack之workmanager的基本使用

使用场景:

场景 推荐
需系统触发,不必完成 ThreadPool + Broadcast
需系统触发,必须完成,可推迟 WorkManager
需系统触发,必须完成,立即 ForegroundService + Broadcast
不需系统触发,不必完成 ThreadPool
不需系统触发,必须完成,可推迟 WorkManager
不需系统触发,必须完成,立即

ForegroundService

 

WorkManager 是一个 Android 库, 它在工作的触发器 (如适当的网络状态和电池条件) 满足时, 优雅地运行可推迟的后台工作。WorkManager 尽可能使用框架 JobScheduler , 以帮助优化电池寿命和批处理作业。在 Android 6.0 (API 级 23) 下面的设备上, 如果 WorkManager 已经包含了应用程序的依赖项, 则尝试使用Firebase JobDispatcher 。否则, WorkManager 返回到自定义 AlarmManager 实现, 以优雅地处理您的后台工作。

也就是说,WorkManager可以自动维护后台任务,同时可适应不同的条件,同时满足后台Service和静态广播,内部维护着JobScheduler,而在6.0以下系统版本则可自动切换为AlarmManager

具体使用:

build.gradle

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

要执行任务的具体类:

UploadWorker.java
package com.jxd.studyone.workmanager;

import android.content.Context;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class UploadWorker extends Worker {
    public UploadWorker(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
        // Do the work here--in this case
        Log.d("work_tag","start======");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d("work_tag","end======");
        /**
         * Result.success():工作成功完成。
         * Result.failure():工作失败。
         * Result.retry():工作失败,根据其重试政策在其他时间尝试。
         */
        return Result.success();
    }
}

启动任务:

package com.jxd.studyone.workmanager;

import androidx.appcompat.app.AppCompatActivity;
import androidx.work.Constraints;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import androidx.work.WorkRequest;

import android.os.Bundle;

import com.jxd.studyone.R;

import java.util.concurrent.TimeUnit;

public class WorkManagerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_work_manager);

        //一次性任务
        WorkRequest myWorkRequest = OneTimeWorkRequest.from(UploadWorker.class);
        WorkManager.getInstance(this).enqueue(myWorkRequest);
//        //定期任务
//        PeriodicWorkRequest saveRequest =
//                new PeriodicWorkRequest.Builder(SaveImageToFileWorker.class, 1, TimeUnit.HOURS)
//                        .build();
//
//        //上面的代码的含义是在每小时的最后 15 分钟内运行定期工作。
//        WorkRequest saveRequest2 =
//                new PeriodicWorkRequest.Builder(SaveImageToFileWorker.class,
//                        1, TimeUnit.HOURS,
//                        15, TimeUnit.MINUTES)
//                        .build();
//
//        //上面代码的作用是,设置任务在加入队列后至少经过 10 分钟后再运行
//        WorkRequest myWorkRequest =
//                new OneTimeWorkRequest.Builder(MyWork.class)
//                        .setInitialDelay(10, TimeUnit.MINUTES)
//                        .build();

//        Constraints myConstraints = new Constraints.Builder()
//                .setRequiresDeviceIdle(true)//指定{@link WorkRequest}运行时设备是否为空闲
//                .setRequiresCharging(true)//指定要运行的{@link WorkRequest}是否应该插入设备
//                .setRequiredNetworkType(NetworkType.NOT_ROAMING)
//                .setRequiresBatteryNotLow(true)//指定设备电池是否不应低于临界阈值
//                .setRequiresCharging(true)//网络状态
//                .setRequiresDeviceIdle(true)//指定{@link WorkRequest}运行时设备是否为空闲
//                .setRequiresStorageNotLow(true)//指定设备可用存储是否不应低于临界阈值
//               // .addContentUriTrigger(myUri,false)//指定内容{@link android.net.Uri}时是否应该运行{@link WorkRequest}更新
//                .build();
    }
}

 

上一篇:14 nginx 配置缓存


下一篇:利用WorkManager实现apk下载