在 Android 牛轧糖中setPeriodic(long intervalMillis) https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#setPeriodic(long)方法调用利用setPeriodic (long intervalMillis, long flexMillis) https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#setPeriodic(long,%20long)安排定期作业。
根据文档:
JobInfo.Builder setPeriodic(长intervalMillis,长flexMillis)
指定该作业应按照提供的间隔重复执行,并且
柔性。该作业可以在弹性长度的窗口中随时执行
期末。
间隔毫秒长:此作业将重复的毫秒间隔。强制执行 getMinPeriodMillis() 的最小值。
flexMillis 长:这项工作的毫秒级弹性。 Flex 至少被限制为 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) {
// Do some heavy operation
......
// At the end inform job manager the status of the job.
jobFinished(params, false);
}
}