2017-02-23 19 views
17

После ввода Deep Idle Mode с помощью:GCM высокого приоритета сообщения не получили в глубоком режиме ожидания

adb shell dumpsys deviceidle force-idle 

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

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

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

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

+0

какое устройство вы используете? есть ли у вас какие-либо диспетчеры задач, которые, вероятно, убивают сервисы Google Play, когда телефон находится в режиме ожидания? –

+0

Проведено несколько тестов на устройстве HTC. В нем нет приложений-менеджеров задач. –

ответ

1

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

Ваше приложение пошел в спящий режим при выполнении команды

adb shell dumpsys deviceidle force-idle 

Doze restrictions

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

  1. Доступ к сети приостановлен ,
  2. Система игнорирует блокировки слежения.
  3. Стандартные тревоги AlarmManager (включая setExact() и setWindow()) откладываются до следующего окна обслуживания.
  4. Если вам нужно установить аварийные сигналы, которые срабатывают во время Doze, используйте setAndAllowWhileIdle() или setExactAndAllowWhileIdle().
  5. Сигнализации, установленные с setAlarmClock() продолжают нормально срабатывать - система выходит из Doos незадолго до того, как эти тревоги загорелись.
  6. Система не выполняет сканирование Wi-Fi.
  7. Система не позволяет запускать адаптеры синхронизации.
  8. Система не позволяет JobScheduler запускать

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

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

1

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

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

Шаг 2: startWakefulService в OnReceive()

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

+0

Я не думаю, что WakefulBroadcastReceiver поможет, так как это помогает поддерживать пробуждение устройства после получения трансляции. –

0

Я знаю, это поздний ответ, но на всякий случай кто-то сталкивается с этой проблемой. Я испытывал одну и ту же проблему и несколько часов пробовал несколько решений, пока не пришел к выводу, что вы не должны использовать adb shell dumpsys deviceidle force-idle для входа в режим глубокого холостого хода, чтобы протестировать ваши push-уведомления, потому что они просто не будут получены (ваше устройство принудительно в режим глубокого холостого хода, что бы ни происходило, если вы не выполнили команду unsce).

Если вы хотите протестировать свои высоконадежные push-уведомления в режиме глубокого холостого хода, используйте вместо этого adb shell dumpsys deviceidle step, чтобы пройти все этапы, пока не достигнете глубокого режима ожидания. Вот пример.

adb shell dumpsys deviceidle get light 
ACTIVE 
adb shell dumpsys deviceidle step 
Stepped to deep: IDLE_PENDING 
adb shell dumpsys deviceidle get light 
INACTIVE 
adb shell dumpsys deviceidle step 
Stepped to deep: SENSING 
adb shell dumpsys deviceidle step 
Stepped to deep: LOCATING 
adb shell dumpsys deviceidle step 
Stepped to deep: IDLE 
adb shell dumpsys deviceidle get light 
OVERRIDE 
adb shell dumpsys deviceidle get deep 
IDLE 

Таким образом, вы войдете в режим глубокой доз, как в сценарии реального случая, и ваши нажатия будут получены, как ожидалось. Извещение что перед вызовом команды шага вы должны выполнить adb shell dumpsys battery unplug и выключить экран устройства.

Мое предположение adb shell dumpsys deviceidle force-idle сильнее, поскольку оно приводит в действие режим ожидания, даже если экран устройства включен. Это полностью вводит в заблуждение от официального андроида doc, когда они говорят: «Вы можете протестировать режим« Доза », выполнив следующие шаги:« и скажите, что вы используете команду принудительного холостого хода. Потому что эта сила-простоя не работает как настоящая, и в этом нет никаких оговорок.