Сообщения с высоким приоритетом GCM, не принятые в режиме глубокого холостого хода

После входа в режим глубокого холостого хода, используя:

adb shell dumpsys deviceidle force-idle

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

{ "to": "feoLl37Ses4: A....... hDQU1OZKd",    "приоритет": "высокий",    "уведомление": {      "тело": "Это тело".      "title": "это название",      "icon": "новый"   } }

Сообщение не получено. Только после того, как я изменил состояние устройства на IDLE_MAINTENANCE, сообщение получено.

Как я могу заставить устройство получать сообщение, даже если оно находится в режиме глубокого холостого хода?

Ответы

Ответ 1

Если вы хотите пробудить приложение из состояния Doze (чтобы вы могли получать сообщения), используйте setAndAllowWhileIdle() и setExactAndAllowWhileIdle().

Ваше приложение перешло в режим Doed, когда вы выполнили команду

adb shell dumpsys deviceidle force-idle

Doze ограничения

Следующие ограничения применяются к вашим приложениям во время Doze:

  • Доступ к сети заблокирован.
  • Система игнорирует блокировки слежения.
  • Стандартные тревоги AlarmManager (включая setExact() и setWindow()) откладываются до следующего окна обслуживания.
  • Если вам нужно установить аварийные сигналы, которые срабатывают во время Doze, используйте setAndAllowWhileIdle() или setExactAndAllowWhileIdle().
  • Тревоги, установленные с помощью setAlarmClock(), продолжают нормально срабатывать - система выходит из Doze незадолго до того, как эти тревоги загорелись.
  • Система не выполняет сканирование Wi-Fi.
  • Система не позволяет запускать адаптеры синхронизации.
  • Система не разрешает запуск JobScheduler

Ограничение Doze при доступе к сети также может повлиять на ваше приложение, особенно если приложение использует сообщения в режиме реального времени, такие как щекотки или уведомления. Если ваше приложение требует постоянного подключение к сети для приема сообщений, вы должны использовать Firebase Cloud Messaging (FCM), если это возможно.

Чтобы помочь в планировании аварийных сигналов, Android 6.0 (API-уровень 23) вводит два новых метода AlarmManager: setAndAllowWhileIdle() и setExactAndAllowWhileIdle(). С помощью этих методов вы можете установить аварийные сигналы который будет срабатывать, даже если устройство находится в режиме Doze.

Ответ 2

Вы должны использовать WakefulBroadcastReceiver, который использует метод startWakefulService(), чтобы запустить службу, которая выполняет эту работу. Этот метод сопоставим с startService(), за исключением того, что WakefulBroadcastReceiver удерживает блокировку после запуска при запуске службы. Цель, которая передается с помощью startWakefulService(), содержит дополнительную идентификацию блокировки слежения.

Шаг 1: Расширьте WakefulBroadcastReceiver вместо BroadcastReceiver.

Шаг 2: startWakefulService in onReceive()

Пожалуйста, дайте мне знать для любых запросов.