Android запускает JobScheduler в определенное время
Я хочу запускать JobScheduler каждый день в определенное время и завершать его через 3 часа.
У меня есть часть запуска задания каждые 20 минут и в течение 3 часов, но в классе JobInfo.Builder нет возможности запустить задание в точное время.
Переходя к обзору классов JobInfo.Builder, там нет ничего, что бы указывало время для запуска JobScheduler.
Очевидно, я не хочу запускать его в течение всего дня и проверять, что время совпадает, это разряжает батарею больше, чем необходимо, и это плохо программирует.
Я думал о том, чтобы включить будильник в указанное время и запустить эту работу, но это кажется немного излишним.
JobInfo.Builder builder = new JobInfo.Builder(NIGHT_SYNC_JOB_ID,
new ComponentName(context, NightSyncDataJobService.class));
//Job starts at 11pm, and ends at 2am. Running every 20 minutes.
builder.setPersisted(true); //Job scheduled to work after reboot
builder.setPeriodic(Consts.ONE_MINUTE * 20);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());
Если у вас есть какое-либо другое решение проблемы, кроме AlarmManger, запускающего этот JobScheduler, мы будем очень благодарны.
2 ответа
Я добился этого следующим образом (без AlarmManager
), создал новую работу (с уникальным JOB_ID
очевидно), и рассказал JobScheduler
запланировать это на какое-то время в будущем, используя setOverrideDeadline()
,
Вот фрагмент кода, который может быть полезен:
private JobInfo getJobInfoForFutureTask(Context context,
long timeTillFutureJob) {
ComponentName serviceComponent = new ComponentName(context, SchedulerService.class);
return new JobInfo.Builder(FUTURE_JOB_ID, serviceComponent)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
.setOverrideDeadline(timeTillFutureJob)
.setRequiresDeviceIdle(false)
.setRequiresCharging(false)
.setPersisted(true)
.build();
}
Обязательно рассчитайте правильный временной сдвиг, на который вы хотите запланировать задачу, а также удалите все существующие идентификаторы заданий из JobScheduler
,
Добавление setMinimumLatency на jobInfo с задержкой текущего времени и целевого времени решает эту проблему.
JobInfo jobInfo = new JobInfo.Builder(1, componentName)
.setPersisted(true)
.setBackoffCriteria(6000, JobInfo.BACKOFF_POLICY_LINEAR)
.setMinimumLatency(1000 * 60)
.build();
для приведенного выше примера планировщик будет работать через 60 секунд.