JobScheduler

  1. 使用场景

特定条件下去做某事,如设备在空闲状态, 并且使用wifi时,自动下载新的Apk.

Android从5.0开始,增加支持一种特殊的机制,即任务调度JobScheduler,该工具集成了常见的几种运行条件,开发者只需添加少数几行代码,即可完成原来要多种组件配合的工作,使代码变得更加优雅.

  1. 必备条件

JobScheduler: 任务调度器

JobInfo : 任务概要信息

JobService: 任务服务,描述具体逻辑

  1. 如何使用

    1. 创建自己的JobService

      继承JobSerive

      onStartJob:在任务开始执行时触发。返回false表示执行完毕,返回true表示需要开发者自己调用 jobFinished方法通知系统已执行完成。

      onStopJob,在任务停止执行时触发。

    2. Activity onStart 创建Service

         Intent startServiceIntent = new Intent(this, MyJobService.class);
         Messenger messengerIncoming = new Messenger(mHandler);
         startServiceIntent.putExtra(MESSENGER_INTENT_KEY, messengerIncoming);
         startService(startServiceIntent);
    复制代码
    1. 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());
    复制代码
    1. onStartJob, onStopJob 都是主线程调用,所以长时间的任务需要子线程去操作!
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享