API планировщика заданий Android L

Я делаю приложение, которое использует API планировщика заданий. Я хочу запускать службу периодически и когда устройство заряжено. Это код.

JobInfo.Builder builder = new JobInfo.Builder(kJobId++, mServiceComponent);
                    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
                    builder.setPeriodic(3000);
                    builder.setRequiresCharging(true);
                    mTestService.scheduleJob(builder.build());

Теперь, когда я запускаю это и отключаю устройство, служба все еще запускается через 3 секунды. Нет никакого эффекта от установки setRequiresCharging.

Когда я комментирую builder.setPeriodic(3000), он работает отлично. Я не уверен, где я ошибаюсь.


person android_eng    schedule 30.11.2014    source источник
comment
Может быть, планировщик заданий не сочетает эти условия так, как вы? Как ИЛИ вместо И. А может и забыли про такие кофры. В документации нет четкого представления о поведении этих условий.   -  person zapl    schedule 30.11.2014
comment
Если вы используете builder.setMinimumLatency(5000) вместе с builder.setOverrideDeadline(60000), он работает с учетом условия (я тестировал с условием Wi-Fi), поэтому, возможно, есть что-то особенное в методе setPeriodic, который говорит ему игнорировать ограничение.   -  person gaurav jain    schedule 02.02.2016


Ответы (1)


Для внутренней идентификации каждого задания платформа создает новый JobStatus, когда новое задание попадает в планировщик. Первое, что делает JobStatus, — это проверяет, есть ли у вашего задания периодический интервал обновления. Если это так, он использует интервал периодического обновления для определения последней точки в будущем, когда задание должно быть запущено, или, другими словами, если у него есть ограничение по срокам.

Один из критериев для рассмотрения задания готов к выполнению, если все его ограничения соблюдены или срок выполнения задания истек. См. JobStatus.isReady для получения дополнительной информации.

JobSchedulerService добавляет несколько StateControllers используется для отслеживания того, когда задания должны запускаться и когда их нужно останавливать. Одним из этих контроллеров является TimeController, который:

устанавливает сигнал тревоги для следующего истекающего задания и определяет, была ли соблюдена минимальная задержка задания

Чтобы определить, следует ли запланировать новый сигнал тревоги, TimeController проверяет, есть ли у вашего задания какая-либо задержка или крайний срок, которые кажутся заданными для всех заданий, если вы устанавливаете периодический интервал обновления.

Я надеюсь, что это поможет вам, по крайней мере, понять, почему ваша работа продолжает планироваться, несмотря на ограничение батареи. Но на данный момент у меня нет решения, которое могло бы предложить простое решение этой проблемы.

person adneal    schedule 30.11.2014
comment
Итак, насколько я понимаю, проверка не выполняется ни по каким критериям, когда она периодическая? Я немного запутался. - person android_eng; 01.12.2014
comment
@Rohit_Ramkumar Меня это тоже немного сбивает с толку, но, похоже, на это указывает источник. JobStatus.isReady проверяет любые ограничения, а затем проверяет ограничения по срокам. После ознакомления с источником вам так не кажется? - person adneal; 01.12.2014
comment
Абсолютно. Теперь я понимаю, но не понимаю, почему они это сделали. Спасибо. - person android_eng; 01.12.2014
comment
Сообщил об этой проблеме. Вот ссылка code.google.com/p/android/issues/ подробно?id=81265 - person android_eng; 29.12.2015