← Назад к вопросам

Что такое Doze mode?

2.0 Middle🔥 81 комментариев
#Android компоненты#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Doze Mode в Android

Что такое Doze Mode?

Doze Mode — это система оптимизации энергопотребления, представленная в Android 6.0 (API 23), которая приостанавливает фоновую активность приложений, когда устройство находится в состоянии покоя и не используется. Основная цель — значительно продлить время работы от аккумулятора за счет ограничения фоновых процессов, сетевых операций и отложенных задач (jobs).

Ключевые принципы работы Doze Mode

Doze активируется, когда выполняются три основных условия:

  1. Устройство не подключено к зарядке
  2. Экран выключен
  3. Устройство неподвижно в течение определенного времени (определяется акселерометром)
// Пример проверки состояния Doze в приложении
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
val isDeviceIdleMode = powerManager.isDeviceIdleMode

if (isDeviceIdleMode) {
    // Устройство находится в режиме Doze
    // Фоновые операции должны быть ограничены
}

Фазы Doze Mode

1. Активная фаза (Active phase)

  • Устройство только что вошло в Doze
  • Короткие окна активности (окна обслуживания)
  • Разрешены сетевые операции и выполнение отложенных задач

2. Глубокая фаза (Deep phase)

  • Длительные периоды бездействия
  • Окна обслуживания становятся реже
  • Большинство операций приостановлено
// Пример работы с окнами обслуживания
public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        // Эта задача может быть выполнена в окне обслуживания Doze
        performBackgroundWork();
        return false;
    }
}

Как Doze Mode влияет на приложения?

Ограничиваемые операции:

  • Сетевые запросы (стандартные HTTP-запросы)
  • AlarmManager (не точные будильники)
  • Wi-Fi сканирование
  • SyncAdapter
  • JobScheduler задачи
  • GPS и другие датчики

Разрешенные операции:

  • Высокоприоритетные push-уведомления (через FCM)
  • Точные будильники (setExactAndAllowWhileIdle())
  • Активности с включенным экраном
  • Сервисы на переднем плане

Оптимизация приложений для Doze Mode

1. Используйте JobScheduler для фоновых задач

val jobScheduler = getSystemService(JobScheduler::class.java)
val jobInfo = JobInfo.Builder(JOB_ID, ComponentName(this, MyJobService::class.java))
    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
    .setPeriodic(15 * 60 * 1000) // 15 минут
    .setPersisted(true) // Сохранять после перезагрузки
    .build()

jobScheduler.schedule(jobInfo)

2. Правильная работа с AlarmManager

// Неправильно - может не сработать в Doze
alarmManager.set(AlarmManager.ELAPSED_REALTIME, triggerTime, pendingIntent);

// Правильно - сработает даже в Doze
alarmManager.setExactAndAllowWhileIdle(
    AlarmManager.ELAPSED_REALTIME_WAKEUP,
    triggerTime,
    pendingIntent
);

3. Оптимизация сетевых операций

  • Объединяйте сетевые запросы
  • Используйте FCM для критически важных уведомлений
  • Реализуйте механизм повторных попыток

4. Тестирование Doze Mode

# Активация Doze Mode через ADB
adb shell dumpsys battery unplug
adb shell dumpsys deviceidle force-idle

# Проверка состояния
adb shell dumpsys deviceidle

Нововведения в более поздних версиях

Android 7.0+ (Doze улучшения):

  • App Standby Buckets — категоризация приложений по частоте использования
  • Project Mainline — более агрессивная оптимизация энергопотребления

Android 9.0+ (Adaptive Battery):

  • Машинное обучение для предсказания использования приложений
  • Автоматическая оптимизация фоновой активности

Android 10.0+:

  • Более строгие ограничения для фонового доступа к местоположению
  • Расширенный контроль разрешений

Рекомендации для разработчиков

Что нужно делать:

  • Тестируйте свое приложение в режиме Doze
  • Используйте WorkManager для фоновых задач
  • Оптимизируйте частоту сетевых запросов
  • Реализуйте обработку прерванных операций

Чего избегать:

  • Длительных фоновых процессов
  • Постоянного удержания wakelock
  • Излишнего использования точных будильников
  • Игнорирования состояния Doze

Отключение Doze Mode (для отладки)

# Отключение оптимизаций для конкретного приложения
adb shell dumpsys deviceidle whitelist +com.example.app

# Проверка белого списка
adb shell dumpsys deviceidle whitelist

Doze Mode — это критически важный механизм, который требует внимания при разработке современных Android-приложений. Правильная адаптация к нему не только улучшает пользовательский опыт за счет экономии батареи, но и предотвращает проблемы с фоновой работой приложения. Современные инструменты вроде WorkManager, JobScheduler и правильное использование FCM позволяют создавать эффективные приложения, которые корректно работают даже при активных энергосберегающих режимах системы.