美文网首页
JobScheduler和JobService

JobScheduler和JobService

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-03-07 10:44 被阅读0次

  为了更好地实现后台服务,Android引入了一个叫JobScheduler的全新API。虽然很多时候能使用AlarmManager和IntentService实现后台服务,但是那绝对不容易。

1.工作原理

  首先,创建一个处理任务的服务(使用JobService子类)。JobService有两个可覆盖的方法:onStartJob(JobParameters)onStopJob(JobParameters)

class PollService extends JobService {
      @Override
      public boolean onStartJob (JobParameters params) {
              return false;
      }
      
      @Override
      public boolean onStopJob (JobParameters params) {
              return false;
     }
}

  Android准备好执行任务的时候,服务就会启动,此时会在主线程上收到onStartJob(...)方法调用。该方法返回false结果表示:“任务已经做完”返回true结果则表示:“任务正在执行,还未做完”

  与IntentService不同,JobService需要单开新线程可使用AsyncTask创建新线程

class PollService extends JobService {
     private PollTask mCurrentTask;

     @Override
      public boolean onStartJob (JobParameters params) {
              mCurrentTask = new PollTask();
              // 开启新线程去做
              mCurrentTask.execute(params);
              //但还没有做完
              return true;
      }

      @Override
      public boolean onStopJob (JobParameters params) {
              if (mCurrentTask != null) {
                    mCurrentTask.cancel(true);
              }
              return false;
     }
      
      class PollTask extends AsyncTask<JobParameters, Void, Void> {
            @Override
             protected Void doInBackground(JobParameters...params) {
                JobParameters jobParams = params[0];
                ....
                //调用JobService.jobFinished(),通知任务是否做完。
                jobFinished(jobParams, false);
                return null;
             }  
       }
}

  任务完成后,就可以调用jobFinished(JobParameters, boolean)方法通知结果。当该方法的第二个参数传入true,就等于说:‘“任务这次做不完了,请计划在下次某个时间继续吧”
  任务运行时也可能会收到onStopJob(Parameters)调用,表明当前任务需要中断。调用onStopJob(...)方法就是表明,服务马上就要停掉了返回true表示:“任务应该计划在下次继续”返回false表示:“事情到此结束,不要计划下次了”

2.添加权限

  在manifest配置文件中登记服务时必须导出并为它添加权限

<service
      android:name=".PollService"
      android:permission="android.permission.BIND_JOB_SERVICE"
      android:exported="true" />

  所谓导出服务,就是把服务暴露出来,添加权限控制的只有JobScheduler才能运行它

3.运行

  可以创建一个JobInfo说明期望的任务运行时间

final int JOB_ID = 1;

JobScheduler scheduler = (JobScheduler)
context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

JobInfo jobInfo = new JobInfo.Builder(JOB_ID, new ComponentName(context, PollService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPeriodic(1000 * 60 * 15)
.setPersisted(true)
.build();

scheduler.shcedule(jobInfo);

  上述代码计划任务每15分钟运行一次,但前提条件是有WiFi或有不限流量网络可用。调用setPersisted(true)方法可保证服务在设备重启后也能按计划运行

4.检查计划

  一旦创建了JobService,启动它就非常迅速了。可以使用JobScheduler检查是否已计划好了任务

final int JOB_ID = 1;

JobScheduler scheduler = (JobScheduler)
context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

boolean hasBeenScheduled = false;
for (JobInfo jobInfo : scheduler.getAllPendingJobs()) {
      if (jobInfo.getId() == JOB_ID) {
              hasBeenScheduled = true;
      }
}

相关文章

网友评论

      本文标题:JobScheduler和JobService

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