美文网首页
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 使用

    Android 5.0推出了一款新的工作模式——JobScheduler,用来执行后台任务。 官方解释:This ...

  • JobScheduler的使用

    在一篇关于网络优化的博文中发现了这个词。我们的项目中并没有使用到这个东西,但看了一下还是非常好用的,mark一下以...

  • JobScheduler 的使用

    一、JobSchedule 的作用 JobSchedule 是一个服务调度器,它可以在特定的条件下吊起我们需要使用...

  • JobScheduler的使用和原理

    1、JobScheduler的使用 1.1 简介 JobScheduler主要用于在未来某个时间下满足一定条件时触...

  • Android JobScheduler的使用和原理

    我们先看一下JobScheduler的使用,了解一下JobScheduler的用法,在看一下JobSchedule...

  • Android Jobscheduler使用

    Android Jobscheduler使用 Until android API 25 一、Jobschedule...

  • Android-JobScheduler使用

    JobScheduler允许开发者创建在后台执行的job,当被预置的条件被满足时,这些job将在后台执行。尤其是在...

  • Spark Streaming(2) - JobSchedule

    本文基于Spark 2.11 1. 前言 Spark Streaming(1)中提到JobScheduler使用J...

  • JobScheduler

    JobScheduler JobScheduler是Android L(API21)新增的特性,用于定义满足某些条...

  • 从JobScheduler到WorkManager

    JobScheduler介绍 JobScheduler是一个任务调度的类。它与AlarmManager不同的是这个...

网友评论

      本文标题:JobScheduler 的使用

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