Zbyt częste wybudzenia

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 komponencie AlarmManager, które zawierają flagę RTC_WAKEUP lub ELAPSED_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.

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.