美文网首页
JobScheduler 的使用

JobScheduler 的使用

作者: 石器时代小古董 | 来源:发表于2019-12-17 18:38 被阅读0次

    一、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

        <service android:name="com.baidu.base.library.utils.job.DefaultJobService"
                     android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"
            />
    

    三、通过 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<JobInfo> 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
    

    五、流程图

    Android-4.jpg

    相关文章

      网友评论

          本文标题:JobScheduler 的使用

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