Wybudzenia to mechanizm w interfejsie API AlarmManager
, który pozwala deweloperom ustawić alarm, aby wybudzał urządzenie o określonej godzinie. Aplikacja ustawia budzik, wywołując jedną z metod set()
w AlarmManager
za pomocą flagi RTC_WAKEUP
lub ELAPSED_REALTIME_WAKEUP
. Po uruchomieniu alarmu budzik urządzenie wyjdzie z trybu niskiego zużycia energii i zatrzyma częściową blokadę wybudzenia podczas wykonywania metody onReceive()
lub onAlarm()
przypisanej do alarmu. Zbyt częsta wybudzanie może spowodować rozładowanie baterii urządzenia.
Aby pomóc Ci poprawić jakość aplikacji, Android automatycznie monitoruje aplikacje pod kątem nadmiernych alarmów wybudzania i wyświetla odpowiednie informacje w Android Vitals. Informacje o sposobie zbierania danych znajdziesz w dokumentacji Konsoli Play.
Jeśli aplikacja zbyt często wybudza urządzenie, skorzystaj ze wskazówek na tej stronie, aby zdiagnozować i rozwiązać problem.
Rozwiąż problem
Usługa AlarmManager
została wprowadzona we wczesnych wersjach platformy Android, ale z czasem wiele przypadków użycia, które wcześniej wymagały AlarmManager
, zostało jednak poprawionych przez nowsze funkcje, takie jak WorkManager.
Ta sekcja zawiera wskazówki dotyczące ograniczania budzika, ale w dłuższej perspektywie zastanów się nad przeniesieniem aplikacji tak, aby przestrzegała zaleceń z sekcji Sprawdzone metody.
Znajdź w aplikacji miejsca, w których ustawiasz budzik, i zmniejsz częstotliwość uruchamiania tych alarmów. Oto kilka wskazówek:
Szukaj wywołań różnych metod
set()
w komponencieAlarmManager
, które zawierają flagęRTC_WAKEUP
lubELAPSED_REALTIME_WAKEUP
.Zalecamy umieszczenie nazwy pakietu, klasy lub metody w nazwie tagu alarmu. Pozwoli to łatwo zidentyfikować miejsce w źródle, w którym został ustawiony alarm. Oto kilka dodatkowych wskazówek:
- Pomiń w nazwie użytkownika wszelkie informacje umożliwiające identyfikację, np. adres e-mail. W przeciwnym razie urządzenie zapisze nazwę
_UNKNOWN
zamiast nazwy alarmu. - Nie pobieraj nazwy klasy ani metody automatycznie, np. wywołując
getName()
, ponieważ Proguard może ją zaciemnić. Zamiast tego użyj ciągu wpisanego na stałe w kodzie. - Nie dodawaj licznika ani unikalnych identyfikatorów do tagów alarmów. System nie będzie w stanie agregować ustawionych w ten sposób alarmów, ponieważ wszystkie mają unikalne identyfikatory.
- Pomiń w nazwie użytkownika wszelkie informacje umożliwiające identyfikację, np. adres e-mail. W przeciwnym razie urządzenie zapisze nazwę
Gdy rozwiążesz problem, sprawdź, czy budzik działa zgodnie z oczekiwaniami, uruchamiając to polecenie ADB:
adb shell dumpsys alarm
To polecenie podaje informacje o stanie usługi systemu alarmowego na urządzeniu. Więcej informacji znajdziesz w dumpsys.
Sprawdzone metody
Budzik użyj tylko wtedy, gdy aplikacja musi wykonać czynność dostępną dla użytkownika (np. opublikować powiadomienie lub zaalarmować użytkownika). Listę sprawdzonych metod dotyczących AlarmManagera znajdziesz w artykule Planowanie alarmów.
Nie używaj AlarmManager
do planowania zadań w tle, w szczególności zadań cyklicznych lub zadań sieciowych w tle. Używaj narzędzia WorkManager do planowania zadań w tle, bo oferuje ono te korzyści:
- grupowanie – zadania są łączone, aby ograniczyć zużycie baterii.
- trwałość – jeśli urządzenie zostanie ponownie uruchomione, zaplanowane zadania WorkManagera będą uruchamiane po jego zakończeniu.
- kryteria – zadania mogą być uruchamiane w zależności od warunków, np. dostępności urządzenia do ładowania lub dostępności Wi-Fi
Więcej informacji znajdziesz w przewodniku po przetwarzaniu w tle.
Nie używaj funkcji AlarmManager
do planowania operacji czasowych, które są ważne tylko wtedy, gdy aplikacja jest uruchomiona. Inaczej mówiąc, operacja czasowa powinna zostać anulowana po zamknięciu aplikacji przez użytkownika. W takich sytuacjach użyj klasy Handler
, ponieważ jest ona łatwiejsza w użyciu i znacznie wydajniejsza.
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy JavaScript jest wyłączony
- Ciągłe częściowe blokady uśpienia
- Błędy ANR