Android Nougat では、定期的なジョブをスケジュールsetPeriodic(long intervalMillis)
するためにメソッド呼び出しが利用されます。setPeriodic (long intervalMillis, long flexMillis)
ドキュメントに従って:
JobInfo.Builder setPeriodic (長い intervalMillis、長い flexMillis)
このジョブが指定された間隔とフレックスで繰り返されるように指定します。ジョブは、期間の終わりにフレックス長のウィンドウでいつでも実行できます。
intervalMillis long:
このジョブが繰り返されるミリ秒間隔。getMinPeriodMillis() の最小値が適用されます。
flexMillis long:
このジョブのミリ秒のフレックス。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);
}
}