Job Scheduler未在Android N上运行

Job Scheduler在 Android Marshmallow和Lollipop设备上按预期工作,但它没有运行和Nexus 5x(Android N预览版).

用于安排作业的代码

ComponentName componentName = new ComponentName(MainActivity.this,TestJobService.class.getName());
        JobInfo.Builder builder;
        builder = new JobInfo.Builder(JOB_ID,componentName);
        builder.setPeriodic(5000);
        JobInfo jobInfo;
        jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobInfo = builder.build();
        int jobId = jobScheduler.schedule(jobInfo);

服务在清单中定义为:

<service android:name=".TestJobService"
            android:permission="android.permission.BIND_JOB_SERVICE" />

在Android N(预览版)上是否有任何人遇到此问题?

解决方法

在Android Nougat中,setPeriodic(long intervalMillis)方法调用使用 setPeriodic (long intervalMillis,long flexMillis)来安排定期作业.

根据文件:

JobInfo.Builder setPeriodic (long intervalMillis,long flexMillis)

Specify that this job should recur with the provided interval and
flex. The job can execute at any time in a window of flex length at
the end of the period.

intervalMillis long:
Millisecond interval for which this job will repeat. A minimum value of getMinPeriodMillis() is enforced.

flexMillis long:
Millisecond flex for this job. Flex is clamped to be at least getMinFlexMillis() or 5 percent of the period,whichever is higher.

示例定期作业计划为5秒:

private static final int JOB_ID = 1001;
private static final long REFRESH_INTERVAL  = 5 * 1000; // 5 seconds

JobInfo jobInfo = new JobInfo.Builder(JOB_ID,serviceName)
        .setPeriodic(REFRESH_INTERVAL)
        .setExtras(bundle).build();

以上代码适用于Lollipop&棉花糖但是当你在牛轧糖中运行时你会注意到以下日志:

W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms

因为我们将周期性刷新间隔设置为5秒,小于thresholdgetMinPeriodMillis(). Android Nougat强制执行getMinPeriodMillis().

作为一种解决方法,如果作业间隔小于15分钟,我将使用以下代码定期调度作业.

JobInfo jobInfo;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  jobInfo = new JobInfo.Builder(JOB_ID,serviceName)
      .setMinimumLatency(REFRESH_INTERVAL)
      .setExtras(bundle).build();
} else {
  jobInfo = new JobInfo.Builder(JOB_ID,serviceName)
      .setPeriodic(REFRESH_INTERVAL)
      .setExtras(bundle).build();
}

示例JobService示例:

public class SampleService extends JobService {
    @Override public boolean onStartJob(JobParameters params) {
        doSampleJob(params); 
        return true;
    }

    @Override public boolean onStopJob(JobParameters params) {
        return false;
    }

    public void doSampleJob(JobParameters params) {
        // Do some heavy operation
        ...... 
        // At the end inform job manager the status of the job.
        jobFinished(params,false);
    }
}

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...