- 使用场景
特定条件下去做某事,如设备在空闲状态, 并且使用wifi时,自动下载新的Apk.
Android从5.0开始,增加支持一种特殊的机制,即任务调度JobScheduler,该工具集成了常见的几种运行条件,开发者只需添加少数几行代码,即可完成原来要多种组件配合的工作,使代码变得更加优雅.
- 必备条件
JobScheduler: 任务调度器
JobInfo : 任务概要信息
JobService: 任务服务,描述具体逻辑
-
如何使用
-
创建自己的JobService
继承JobSerive
onStartJob:在任务开始执行时触发。返回false表示执行完毕,返回true表示需要开发者自己调用 jobFinished方法通知系统已执行完成。
onStopJob,在任务停止执行时触发。
-
Activity onStart 创建Service
Intent startServiceIntent = new Intent(this, MyJobService.class); Messenger messengerIncoming = new Messenger(mHandler); startServiceIntent.putExtra(MESSENGER_INTENT_KEY, messengerIncoming); startService(startServiceIntent); 复制代码
- Activity中配置JobInfo
JobInfo.Builder builder = new JobInfo.Builder(mJobId++, mServiceComponent);
String delay = mDelayEditText.getText().toString(); if (!TextUtils.isEmpty(delay)) { //设置至少延迟多久后执行,单位毫秒. builder.setMinimumLatency(Long.valueOf(delay) * 1000); } String deadline = mDeadlineEditText.getText().toString(); if (!TextUtils.isEmpty(deadline)) { //设置最多延迟多久后执行,单位毫秒。 builder.setOverrideDeadline(Long.valueOf(deadline) * 1000); } boolean requiresUnmetered = mWiFiConnectivityRadioButton.isChecked(); boolean requiresAnyConnectivity = mAnyConnectivityRadioButton.isChecked(); if (requiresUnmetered) { //设置需要的网络条件,有三个取值: //JobInfo.NETWORK_TYPE_NONE(无网络时执行,默认)、 //JobInfo.NETWORK_TYPE_ANY(有网络时执行)、 //JobInfo.NETWORK_TYPE_UNMETERED(网络无需付费时执行) builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); } else if (requiresAnyConnectivity) { builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); } //是否在空闲时执行 builder.setRequiresDeviceIdle(mRequiresIdleCheckbox.isChecked()); //是否在充电时执行 builder.setRequiresCharging(mRequiresChargingCheckBox.isChecked()); // Extras, work duration. PersistableBundle extras = new PersistableBundle(); String workDuration = mDurationTimeEditText.getText().toString(); if (TextUtils.isEmpty(workDuration)) { workDuration = "1"; } extras.putLong(WORK_DURATION_KEY, Long.valueOf(workDuration) * 1000); builder.setExtras(extras); // Schedule job Log.d(TAG, "Scheduling job"); JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); tm.schedule(builder.build()); 复制代码
- onStartJob, onStopJob 都是主线程调用,所以长时间的任务需要子线程去操作!
-
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END