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 секунд.

Другие вопросы по тегам