В чем особенности работы приложений с режимом Doze в Android и чем он отличается от фоновых процессов?
Что проверяют
Различаете ли вы состояние устройства и состояние приложения, и умеете ли воспроизвести Doze на стенде, не ожидая часами. Следом почти всегда просят назвать команды adb и объяснить, что будет с уведомлениями и напоминаниями.
Как отвечать
Doze появился в Android 6.0 и включается для всего устройства: экран выключен, зарядка отключена, телефон лежит неподвижно. В Android 7.0 добавили облегчённый режим, который срабатывает и в движении. В Doze система отключает приложениям сеть, игнорирует WakeLock и откладывает обычные будильники AlarmManager, задачи JobScheduler и WorkManager до окон обслуживания, которые со временем становятся реже. Проходят исключения: высокоприоритетные push через FCM, setAlarmClock(), setExactAndAllowWhileIdle() с ограничением частоты, приложения из списка исключений оптимизации батареи.
Фоновая работа это уже про конкретное приложение, и тут свои механизмы: лимиты фоновых сервисов с Android 8.0, App Standby Buckets с Android 9 (active, working set, frequent, rare, restricted), foreground service с обязательным уведомлением и, начиная с Android 14, объявленным типом.
Для тестировщика главное это команды:
adb shell dumpsys battery unplug: имитировать отключение зарядки;adb shell dumpsys deviceidle force-idle: сразу перевести устройство в Doze, аstepпроходит состояния по одному;adb shell am set-standby-bucket <package> rare: проверить приложение в редком бакете;dumpsys deviceidle unforceиdumpsys battery reset: вернуть всё обратно.
Сценарии: придёт ли уведомление, сработает ли напоминание вовремя, догонит ли синхронизация после выхода из Doze, не потеряются ли данные.
Где спотыкаются
Считают Doze тем же самым, что закрытое приложение. Doze отнимает сеть и WakeLock у всех, кто не в списке исключений, даже если пользователь приложение не закрывал.
Проверяют только на эмуляторе и Google Pixel. Xiaomi, Huawei, Samsung добавляют свои агрессивные ограничения, и именно там живут баги вида «напоминание не сработало».
Ждут, что задача WorkManager выполнится точно по времени. В Doze она уходит в окно обслуживания, это ожидаемое поведение, а не баг.