WorkManager setRequiresDeviceIdle сбивает с толку
Я реализовал плановую работу менеджера. Моя идея - завершать процесс каждые 2 часа. Но мне нужно гарантированное исполнение. Согласно документации руководителя работ каждый поставленный в очередь процесс будет гарантированно выполнен.
Но теперь этот setRequiresDeviceIdle меня запутывает. В документации указано, что по умолчанию для setRequiresDeviceIdle установлено значение false. Поэтому я предположил, что мой процесс не будет работать, если устройство находится в режиме ожидания.
И режим ожидания = когда телефон выключен на экран в течение некоторого интервала.
Но если я установлю для этого setRequiresDeviceIdle значение true. Я предполагаю, что теперь он будет работать только тогда, когда устройство находится в режиме ожидания.
Я хочу, чтобы процесс был завершен, даже если устройство находится в режиме ожидания или не находится в режиме ожидания. Что мне теперь делать?
1 ответ
Если вы просмотрите документы WorkManager, вы найдете:
requireDeviceIdle boolean: true, если устройство должно бездействовать для выполнения работы
Если вы пройдете true
, это означает, что ваша работа будет выполнена только тогда, когда устройство находится в idle state
,
Как вы упоминаете, вы хотите, чтобы ваша задача выполнялась всегда. Следовательно, вы должны пройти false
в setRequiresDeviceIdle()
,
Примечание: не обязательно, что ваша задача будет выполнена ровно через 2 часа. Согласно DOCS, ваша задача может быть отложена до следующего maintenance window
, Ваша задача будет выполнена наверняка, но продолжительность не будет точно 2 часа. Это может быть немного больше, чем это.
В режиме ожидания система пытается сэкономить заряд батареи, ограничивая доступ приложений к сетевым и ресурсоемким службам. Это также предотвращает доступ приложений к сети и откладывает их работу, синхронизацию и стандартные сигналы тревоги.
Периодически система выходит из режима Doze на короткое время, чтобы позволить приложениям выполнять отложенные действия. Во время этого окна обслуживания система запускает все ожидающие синхронизации, задания и аварийные сигналы и позволяет приложениям получать доступ к сети.
Если вы не хотите, чтобы ваша задача выполнялась всегда и в точное время, вы можете использовать Alarm Manager и setExactAndAllowWhileIdle()
, Но такая практика не рекомендуется, так как она не очень хороша для работы батареи.