В чем особенности работы приложений с режимом Doze в Android и чем он отличается от фоновых процессов?
Что проверяют
Понимаете ли вы, что Doze это состояние всего устройства, а не очередное ограничение фоновых сервисов, и умеете ли строить фоновую работу с его учётом. Следом спрашивают, как доставить срочное событие спящему телефону и как проверить приложение в Doze, не дожидаясь его часами.
Как отвечать
Doze появился в Android 6.0. Устройство уходит в него, когда экран выключен, зарядка не подключена и телефон какое-то время лежит без движения. С Android 7.0 есть облегчённый режим, который включается при выключенном экране и в движении. В Doze для всех приложений:
- сеть: недоступна, запросы не проходят;
- wake lock: игнорируются, процессор засыпает;
- алармы: обычные алармы
AlarmManagerоткладываются,setExactAndAllowWhileIdle()срабатывает, но с ограничением по частоте; - задачи:
JobScheduler,WorkManagerи синхронизация ждут окна обслуживания.
Окна обслуживания система открывает периодически, отложенная работа выполняется в них пачкой, и со временем окна становятся реже.
Ограничения фоновых процессов устроены иначе: они привязаны к приложению. App Standby Buckets режут работу приложений, которыми редко пользуются, а лимиты Android 8.0 запрещают запуск фоновых сервисов даже на активном устройстве. Doze же усыпляет весь телефон, как бы часто вашим приложением ни пользовались.
Как с этим жить: периодическую работу отдавать WorkManager с Constraints, срочные события доставлять высокоприоритетным сообщением FCM, которое ненадолго будит приложение, будильник ставить через setAlarmClock(). Исключение из оптимизации батареи Google Play разрешает только узкому кругу приложений.
Проверка: adb shell dumpsys battery unplug, затем adb shell dumpsys deviceidle force-idle, для App Standby adb shell am set-inactive <пакет> true.
Где спотыкаются
Путают Doze с убийством процесса. Процесс может остаться жив, но без сети и таймеров.
Строят синхронизацию на Handler и своём сервисе, а утром удивляются, что данные не обновились.
Шлют высокоприоритетные FCM без видимого уведомления. Система понижает приоритет таким сообщениям, и срочная доставка перестаёт работать.