6

Próbuję wywołać alarm w mojej aplikacji co 30 minut, używając Menedżera alarmów setExactAndAllowWhileIdle, ale to nie działa!Menedżer alarmów systemu Android setExactAndAllowWhileIdle() nie działa w systemie Android 7.0 Nougat w trybie Doze

przetestować funkcjonalność poprzez wystawienie powiadomienia push ilekroć odbierać sygnał alarmowy.

Problemem jest to: gdy urządzenie przechodzi w tryb drzemać po bezczynności kiedyś, już nie otrzymywać alarmy. Jednak zaraz po włączeniu ekranu otrzymuję powiadomienie. Moja aplikacja wymaga dokładnych alarmów, które muszą być dostarczone dokładnie co 30 minut! Nie może sobie pozwolić na otrzymywanie opóźnionych alarmów lub upuszczonych, ponieważ urządzenie jest w trybie Doze!

użyłem następujących w moim kodu:

  1. ustawić alarm, gdy otwieram aplikację.
  2. Otrzymuję sygnał alarmowy za pomocą WakefulBroadcastReceiver. W metodzie onReceive() ustawiam następny alarm. Też, uruchom startWakefulService, która wysyła tylko powiadomienie push, a następnie zatrzymuje się sam .
  3. Nazywam completePakefulIntent na końcu onReceive().
  4. Próbowałem testowania zarówno: RTC_WAKEUP & ELAPSED_REALTIME_WAKEUP

Uwagi:

  • Klasa wakefulbroadcastReceiver jest zarejestrowany w manifeście.
  • dodałem uprawnienia: android.permission.WAKE_LOCK
  • Próbowałem Biało-listingu moją aplikację, ale wyniki są takie same
  • Próbowałem za pomocą setAlarmClock() który pracował cały czas, nawet w trybie drzemać , z jednej spadł/opóźnionego alarmu co 50 alarmów. Tak więc nie jest to również idealne rozwiązanie. I nie chcę, aby użytkownik widział tam ikonę alarmową cały czas w górę .
  • Nie tylko setExactAndAllowWhileIdle() nie działa podczas drzemki, ale również ma straszną dokładność, gdy pracuje. Zwykle otrzymuję wiele sygnałów alarmowych
    albo 1-3 minuty później, albo 1-3 minuty wcześniej.
  • Testuję używając Huawei Mate 8 i Androida 7.0 Nougat.

P.S: Przed udzieleniem odpowiedzi należy upewnić się, że są świadomi ograniczeń nałożonych począwszy Android 6.0 M oraz tryb Doze.

link1: https://developer.android.com/training/monitoring-device-state/doze-standby.html

Podsumowując mówi tak:

  • Jeśli trzeba ustawić alarmy, które podczas pożaru w drzemać, używają setAndAllowWhileIdle() lub setExactAndAllowWhileIdle().
  • Alarmy ustawione za pomocą setAlarmClock() kontynuują normalne uruchamianie - system kończy działanie Drzemki na krótko przed uruchomieniem alarmu.

Dlaczego nie otrzymam dokładnych sygnałów alarmowych co 30 minut przy użyciu setExactAndAllowWhileIdle()?! I dlaczego nie jest setAlarmClock() w 100% niezawodny ?!

+0

To może pomóc (https://stackoverflow.com/a/39739886/3117966) – Nisarg

+1

Mam ten sam problem i widzę podobne obserwacje. Szkoda, że ​​ktoś z Google nie może zgłosić problemu i naprawić ten problem. – d777

+0

@Mena Czy znalazłeś rozwiązanie, mam ten sam problem. – CauCuKien

Odpowiedz

0

Można uzyskać dokładne alarmy, ale in Doze mode

System ignoruje blokady wybudzania.

Więc wydaje się, że AlarmManager.setAlarmClock jest jedynym akceptowalnym rozwiązaniem jeśli naprawdę potrzebne do uruchomienia co 30 minut. To prawdopodobnie neguje wszystkie oszczędności energii w trybie drzemki ...

BTW: wygląda na to, że możesz zobaczyć alarmy z adb shell dumpsys alarm.

Powiązane problemy