一而芥、JobSchedule 的作用
JobSchedule 是一個服務(wù)調(diào)度器读虏,它可以在特定的條件下吊起我們需要使用的服務(wù)猬膨。JobSchedule 為每一個要執(zhí)行的 JobService 分配了一個 JobInfo惊搏,JobInfo 就是我們給這個 JobService 定制的條件梭姓。遵班,
二屠升、使用 JobSchedule
1.獲取 JobScheduler
通過 SystemService 獲取
JobScheduler mJobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
2.定義需要管理的 JobService
繼承 JobService,重寫 onStartJob 和 onStopJob 兩個方法狭郑,返回 true 代表這個服務(wù)獎持續(xù)運行腹暖,直到用戶主動調(diào)用 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 獲取到
// 創(chuàng)建一個新的任務(wù)
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 的請求
合并請求其實就是將之前已經(jīng)存放到 JobSchedule 的任務(wù)取出,將這個任務(wù)需要發(fā)送的數(shù)據(jù)保存起來亩鬼,然后和新的任務(wù)要發(fā)送的數(shù)據(jù)統(tǒng)一交給一個 JobInfo.
比如通過字符串拼接殖告,統(tǒng)一保存到一個集合中等方式
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;
// 把之前存儲的任務(wù) cancel 掉,并且不斷拼接成一個新的任務(wù)
mJobScheduler.cancel(DEF_JOB_ID);
}
}
2.在 JobService 中取出這些數(shù)據(jù)然后
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