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:
- ustawić alarm, gdy otwieram aplikację.
- 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 . - Nazywam completePakefulIntent na końcu onReceive().
- 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 ?!
To może pomóc (https://stackoverflow.com/a/39739886/3117966) – Nisarg
Mam ten sam problem i widzę podobne obserwacje. Szkoda, że ktoś z Google nie może zgłosić problemu i naprawić ten problem. – d777
@Mena Czy znalazłeś rozwiązanie, mam ten sam problem. – CauCuKien