2017-02-23 33 views
17

Po wejściu w tryb głębokiego Idle używając:GCM komunikaty o wysokim priorytecie nie otrzymał w głębokim trybie bezczynności

adb shell dumpsys deviceidle force-idle 

Próbuję wysłać urządzenie wiadomość o wysokim priorytecie, jak sugeruje the documentation, używając:

{ "do": "feoLl37Ses4: a ....... hDQU1OZKd", "priorytet": "wysoki", "powiadomienia": { "ciało": "to jest ciało." , "title": "to jest tytuł",nie otrzymał "nowe" } }

komunikat: "ikona". Dopiero po zmianie stanu urządzenia na IDLE_MAINTENANCE zostanie odebrana wiadomość.

Jak mogę otrzymać urządzenie, aby odebrać wiadomość, nawet jeśli jest w trybie bezczynności?

+0

jakiego urządzenia używasz? czy masz zainstalowanych menedżerów zadań, które prawdopodobnie zabijają usługi Google Play, gdy telefon jest w stanie bezczynności? –

+0

Zrobiłem kilka testów na urządzeniu HTC. Nie ma zainstalowanych żadnych aplikacji menedżera zadań. –

Odpowiedz

1

Jeśli chcesz obudzić aplikację ze stanu drzemki (aby odbierać wiadomości), użyj: setAndAllowWhileIdle() i setExactAndAllowWhileIdle().

Twoja aplikacja poszedł do trybu Doze gdy wykonał polecenie

adb shell dumpsys deviceidle force-idle 

Doze restrictions

następujących ograniczeń do aplikacji, podczas gdy w drzemać:

  1. Dostęp do sieci jest zawieszony .
  2. System ignoruje blokady wybudzania.
  3. Standardowe alarmy AlarmManager (w tym setExact() i setWindow()) są odkładane do następnego okna konserwacji.
  4. Jeśli chcesz ustawić alarmy, które uruchamiają się w trybie drzemki, użyj funkcji setAndAllowWhileIdle() lub setExactAndAllowWhileIdle().
  5. Alarmy ustawione za pomocą setAlarmClock() kontynuują normalne uruchamianie - system wychodzi z funkcji Drzemki na krótko przed uruchomieniem tych alarmów.
  6. System nie wykonuje skanów Wi-Fi.
  7. System nie zezwala na działanie adapterów synchronizacji.
  8. System nie pozwala JobScheduler uruchomić

Ograniczenie Doze na dostęp do sieci ma również wpłynąć na aplikację, zwłaszcza jeśli aplikacja opiera się na wiadomości w czasie rzeczywistym, takich jak łaskocze lub zawiadomień. Jeśli Twoja aplikacja wymaga stałego połączenia z siecią, aby odbierać wiadomości, powinieneś użyć Firebase Cloud Messaging (FCM), jeśli to możliwe.

Aby pomóc z alarmami planowania, Android 6.0 (API poziom 23) wprowadza dwa nowe metody AlarmManager: setAndAllowWhileIdle() i setExactAndAllowWhileIdle(). Za pomocą tych metod można ustawić alarmy, które będą uruchamiane, nawet jeśli urządzenie jest w pozycji Drzemka.

1

Musisz użyć WakefulBroadcastReceiver, który używa metody startWakefulService(), aby uruchomić usługę, która wykonuje pracę. Ta metoda jest porównywalna do metody startService(), z tym że WakefulBroadcastReceiver trzyma blokadę wybudzania po uruchomieniu usługi. Intencja przekazywana za pomocą metody startWakefulService() zawiera dodatkową identyfikację blokady wybudzania.

Krok 1: Przedłużenie WakefulBroadcastReceiver zamiast BroadcastReceiver.

Krok 2: startWakefulService w onReceive()

proszę dać mi znać na wszelkie pytania.

+0

Nie sądzę, że WakefulBroadcastReceiver pomoże, ponieważ pomaga utrzymać urządzenie w stanie czuwania po otrzymaniu transmisji. –

0

Wiem, że odpowiedź jest spóźniona, ale na wszelki wypadek, gdy ktoś wpadnie na ten sam problem. Wystąpił ten sam problem i spędziłem kilka godzin próbując kilku rozwiązań, aż doszedłem do wniosku, że nie powinieneś używać adb shell dumpsys deviceidle force-idle, aby wejść w tryb głębokiego bezczynności, aby przetestować powiadomienia push, ponieważ one po prostu nie zostaną odebrane (twoje urządzenie jest wymuszone do głębokiego trybu bezczynności, cokolwiek się stanie, chyba że wykonasz polecenie unforce).

Jeśli chcesz przetestować powiadomienia o wysokim priorytecie w trybie głębokiego spoczynku, użyj zamiast tego adb shell dumpsys deviceidle step, aby przejść przez wszystkie kroki, aż osiągniesz tryb bezczynności. Oto przykład.

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 

W ten sposób wejdziesz w tryb głębokiej drzemki, tak jak w rzeczywistym przypadku, a twoje popchnięcia zostaną odebrane zgodnie z oczekiwaniami. Powiadomienie, że przed wywołaniem polecenia step należy wykonać polecenie adb shell dumpsys battery unplug i wyłączyć ekran urządzenia.

Domyślam się, że adb shell dumpsys deviceidle force-idle jest silniejszy, ponieważ wymusza tryb bezczynności, nawet jeśli ekran urządzenia jest włączony. To całkowicie mylące z oficjalnym androidem doc kiedy mówią "Możesz testować tryb Doze, wykonując następujące czynności:" i powiedz, aby użyć polecenia force-idle. Ponieważ ta siła-idle nie działa tak jak prawdziwa i nie ma w tym żadnej zrzeczenia.