在Android Nougat中,
setPeriodic(long intervalMillis)
方法调用使用了
setPeriodic (long intervalMillis, long flexMillis)
来安排定期工作。
根据文档:
JobInfo.Builder setPeriodic (long intervalMillis, long flexMillis)
指定此作业应重复并提供间隔和灵活性。该作业可以在周期结束时的任何时间执行一个持续时间为灵活长度的窗口内。
intervalMillis long:
此作业重复的毫秒间隔。强制执行getMinPeriodMillis()的最小值。
flexMillis long:
此作业的毫秒灵活性。灵活性被夹紧,至少为getMinFlexMillis()或周期的5%中较高的那个。
示例:定期作业每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和Marshmallow中运行良好,但是当您在Nougat中运行时,您会注意到以下日志:
W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms
鉴于我们已将定期刷新间隔设置为5秒,该间隔小于getMinPeriodMillis()
阈值。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) {
......
jobFinished(params, false);
}
}