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