Ответ 1
Если кто-то все еще пытается преодолеть ситуацию,
Вот обходной путь для> = Android N (Если вы хотите установить периодическое задание ниже 15 минут)
Убедитесь, что используется только setMinimumLatency. Кроме того, если вы выполняете задание, которое занимает много времени, следующее задание будет запланировано в, текущее время завершения работы JOB + PROVIDED_TIME_INTERVAL
.SetPeriodic(long millis) хорошо работает для уровня API ниже Android N
@Override
public boolean onStartJob(final JobParameters jobParameters) {
Log.d(TAG,"Running service now..");
//Small or Long Running task with callback
//Reschedule the Service before calling job finished
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
scheduleRefresh();
//Call Job Finished
jobFinished(jobParameters, false );
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return false;
}
private void scheduleRefresh() {
JobScheduler mJobScheduler = (JobScheduler)getApplicationContext()
.getSystemService(JOB_SCHEDULER_SERVICE);
JobInfo.Builder mJobBuilder =
new JobInfo.Builder(YOUR_JOB_ID,
new ComponentName(getPackageName(),
GetSessionService.class.getName()));
/* For Android N and Upper Versions */
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mJobBuilder
.setMinimumLatency(60*1000) //YOUR_TIME_INTERVAL
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
}
ОБНОВЛЕНИЕ: Если вы планируете повторять свое повторное задание в режиме "Доза" и думая о JobScheduler, FYI: JobSchedulers не могут работать в режиме "Дозировка".
Я не обсуждал о Dozing, потому что мы говорили о JobScheduler. Спасибо, @Elletlar, за то, что некоторые могут подумать, что он будет работать, даже если приложение находится в режиме доз, что не так.
Для режима доза AlarmManager по-прежнему дает лучшее решение. Вы можете использовать setExactAndAllowWhileIdle(), если вы хотите выполнять периодическую работу в определенный период времени или использовать setAndAllowWhileIdle(), если вы гибки.
Вы также можете установить userAlarmClock(), поскольку устройство всегда выходит из режима доз для будильника и снова возвращается в режим доз. Другой способ - использовать FCM.
Ссылка: Ограничения на дозу
https://developer.android.com/training/monitoring-device-state/doze-standby