JobScheduler 的使用

一、JobSchedule 的作用

JobSchedule 是一个服务调度器,它可以在特定的条件下吊起我们需要使用的服务。JobSchedule 为每一个要执行的 JobService 分配了一个 JobInfo,JobInfo 就是我们给这个 JobService 定制的条件。,

二、使用 JobSchedule

1.获取 JobScheduler
通过 SystemService 获取

  JobScheduler mJobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

2.定义需要管理的 JobService

继承 JobService,重写 onStartJob 和 onStopJob 两个方法,返回 true 代表这个服务奖持续运行,直到用户主动调用 jobFinished 方法

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class DefaultJobService extends JobService {
      @Override
    public boolean onStartJob(JobParameters params) {
        new MyAsyncTask().execute(params);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}

在 manifest 中配置 JobService

    

三、通过 JobInfo 配置启动条件

PersistableBundle 使用配置传递个 JobService 的消息,在 JobService 的 onStartJob 可以通过 JobParameters 获取到

        // 创建一个新的任务
        PersistableBundle bundle = new PersistableBundle();
        bundle.putString("DATA", task);
        JobInfo jobInfo =
                new JobInfo.Builder(DEF_JOB_ID, new ComponentName(context, DefaultJobService.class))
                        .setRequiresCharging(true)
                        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                        .setExtras(bundle).build();
        mJobScheduler.schedule(jobInfo);

四、合并 JobInfo 的请求

合并请求其实就是将之前已经存放到 JobSchedule 的任务取出,将这个任务需要发送的数据保存起来,然后和新的任务要发送的数据统一交给一个 JobInfo.

比如通过字符串拼接,统一保存到一个集合中等方式

       JobInfo pendingJob = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            pendingJob = mJobScheduler.getPendingJob(DEF_JOB_ID);
        } else {
            List allPendingJobs = mJobScheduler.getAllPendingJobs();
            for (JobInfo info : allPendingJobs) {
                pendingJob = info;
                break;
            }
        }
        if (null != pendingJob) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                PersistableBundle extras = pendingJob.getExtras();
                String data = extras.getString("DATA");
                task = data + "@" + task;
                // 把之前存储的任务 cancel 掉,并且不断拼接成一个新的任务
                mJobScheduler.cancel(DEF_JOB_ID);
            }
        }

2.在 JobService 中取出这些数据然后

            mJobParameters = jobParameters[0];
            PersistableBundle extras = mJobParameters.getExtras();
            // 拿到 JobManager 里存放的
            String data = extras.getString("DATA");
            ALog.d("TAG", "iov job manager data " + data);
            for (String str:data.split("@")){
                sendMessage(str);
            }

output

iov job manager data test 1@test 2@test 3

五、流程图

JobScheduler 的使用_第1张图片
Android-4.jpg

你可能感兴趣的:(JobScheduler 的使用)