Optymalizuj pod kątem funkcji uśpienia i czuwania aplikacji

Android ma 2 funkcje oszczędzające energię, które zwiększają żywotność baterii przez zarządzanie działaniem aplikacji, gdy urządzenie nie jest podłączone do zasilania: Uśpienie i Czuwanie aplikacji. Uśpienie zmniejsza zużycie baterii, opóźniając działanie procesora w tle i aktywności w sieci w przypadku aplikacji, gdy urządzenie jest nieużywane przez dłuższy czas. Tryb czuwania aplikacji opóźnia aktywność sieci w tle w przypadku aplikacji, w których ostatnio nie było aktywności użytkownika.

Gdy urządzenie jest w trybie uśpienia, dostęp aplikacji do niektórych zasobów zużywających dużo energii jest odroczony do okresu konserwacji. Konkretne ograniczenia są wymienione w sekcji Ograniczenia dotyczące zarządzania zasilaniem.

Uśpienie i czuwanie aplikacji zarządzają działaniem wszystkich aplikacji działających na Androidzie 6.0 lub nowszym, niezależnie od tego, czy są kierowane na interfejs API na poziomie 23. Aby zapewnić użytkownikom jak najlepsze wrażenia, przetestuj swoją aplikację w trybach uśpienia i czuwania, a następnie wprowadź niezbędne zmiany w kodzie. Szczegółowe informacje znajdziesz w poniższych sekcjach.

Zrozumienie funkcji Uśpienie

Jeśli użytkownik pozostawi urządzenie bez połączenia i nieruchomości przez pewien czas z wyłączonym ekranem, przejdzie w tryb uśpienia. W trybie uśpienia system próbuje oszczędzać baterię, ograniczając dostęp aplikacji do usług sieciowych i intensywnie obciążających procesor. Blokuje też aplikacjom dostęp do sieci i opóźnia czas ich wykonywania, synchronizacji oraz standardowych alarmów.

Okresowo system wychodzi na chwilę z funkcji Uśpienie, aby umożliwić aplikacjom wykonanie odłożonych działań. W tym okresie konserwacji system uruchamia wszystkie oczekujące synchronizacje, zadania i alarmy, a także zezwala aplikacjom na dostęp do sieci.

Rysunek 1. Uśpienie zapewnia cykliczny okres konserwacji, przez który aplikacje mogą korzystać z sieci i obsługiwać oczekujące działania.

Po zakończeniu okresu konserwacji system ponownie przejdzie w tryb uśpienia, zawieszając dostęp do sieci i odkładając zadania, synchronizacje i alarmy. Z czasem system będzie rzadziej planował okresy konserwacji, co pozwoli ograniczyć zużycie baterii w przypadku dłuższego braku aktywności, gdy urządzenie się nie ładuje.

Gdy użytkownik wybudzi urządzenie, przesuwając je, włączając ekran lub podłączając ładowarkę, system zamyka tryb uśpienia i wszystkie aplikacje wznawiają normalną aktywność.

Ograniczenia dotyczące uśpienia

Gdy urządzenie jest w trybie uśpienia, system stosuje do Twoich aplikacji te ograniczenia:

Lista kontrolna uśpienia

Dostosuj aplikację do funkcji Uśpienie

Uśpienie może w różny sposób wpływać na działanie aplikacji w zależności od ich funkcji i usług. Wiele aplikacji działa normalnie w cyklach uśpienia bez modyfikacji. W niektórych przypadkach trzeba zoptymalizować sposób, w jaki aplikacja zarządza siecią, alarmami, zadaniami i synchronizacją. Aplikacje muszą mieć możliwość efektywnego zarządzania działaniami w każdym okresie konserwacji.

Aby ułatwić sobie planowanie alarmów, możesz używać 2 metod AlarmManager: setAndAllowWhileIdle() i setExactAndAllowWhileIdle(). Korzystając z tych metod, możesz ustawiać alarmy, które uruchamiają się nawet wtedy, gdy urządzenie jest w trybie uśpienia.

Ograniczenie dostępu do sieci również może mieć wpływ na aplikację, zwłaszcza jeśli działanie aplikacji polega na wysyłaniu wiadomości w czasie rzeczywistym, takich jak tykanie czy powiadomienia. Jeśli Twoja aplikacja do odbierania wiadomości wymaga stałego połączenia z siecią, w miarę możliwości użyj Komunikacji w chmurze Firebase (FCM).

Aby sprawdzić, czy po włączeniu funkcji Uśpienie aplikacja działa zgodnie z oczekiwaniami, możesz użyć poleceń adb, które wymuszą system na wejściu i wyjściu z funkcji Uśpienie oraz obserwowanie jej działania. Więcej informacji znajdziesz w artykule Testowanie w trybie uśpienia i gotowości aplikacji.

Tryb czuwania aplikacji

Czuwanie aplikacji pozwala systemowi określić, że aplikacja jest nieaktywna, gdy użytkownik jej nie używa. System decyduje o tym, gdy użytkownik nie korzysta z aplikacji przez określony czas i nie jest spełniony żaden z tych warunków:

  • Użytkownik samodzielnie uruchamia aplikację.
  • Aplikacja ma proces na pierwszym planie, jako aktywność lub usługę na pierwszym planie albo używany przez inną aktywność lub usługę.
  • Aplikacja generuje powiadomienie, które użytkownicy widzą na ekranie blokady lub w obszarze powiadomień.

Gdy użytkownik podłącza urządzenie do źródła zasilania, system uruchamia aplikacje ze stanu gotowości, co pozwala im na swobodny dostęp do sieci oraz wykonywanie wszelkich oczekujących zadań i synchronizacji. Jeśli urządzenie jest nieaktywne przez dłuższy czas, system zezwala nieaktywnym aplikacjom na dostęp do sieci mniej więcej raz dziennie.

Korzystaj z FCM do interakcji z aplikacją, gdy urządzenie jest bezczynne

Komunikacja w chmurze Firebase (FCM) to usługa między chmurą a urządzeniem, która umożliwia obsługę przesyłania danych w czasie rzeczywistym między usługami backendu i aplikacjami na urządzeniach z Androidem. FCM zapewnia jedno trwałe połączenie z chmurą. To połączenie mogą udostępniać wszystkie aplikacje, które wymagają wysyłania wiadomości w czasie rzeczywistym. Takie współdzielone połączenie znacznie optymalizuje zużycie baterii, ponieważ nie pozwala wielu aplikacjom na utrzymywanie własnych, odrębnych połączeń trwałych, co może szybko wyczerpywać baterię. Dlatego, jeśli Twoja aplikacja wymaga integracji przesyłania wiadomości z usługą backendu, w miarę możliwości zalecamy korzystanie z FCM zamiast utrzymywania własnego stałego połączenia sieciowego.

Usługa FCM jest zoptymalizowana do działania w trybach uśpienia i czuwania aplikacji. Wiadomości o wysokim priorytecie w FCM umożliwiają wybudzanie aplikacji, aby zaangażować użytkownika. W trybie uśpienia lub czuwania aplikacji system przesyła komunikat i przyznaje aplikacji tymczasowy dostęp do usług sieciowych i częściowych blokad uśpienia, a potem przywraca urządzenie lub aplikację do stanu bezczynności. W przypadku pilnych powiadomień widocznych dla użytkownika rozważ użycie wiadomości o wysokim priorytecie w celu włączenia trybu uśpienia. Wiadomości o wysokim priorytecie mogą generować powiadomienia. Więcej informacji znajdziesz w wytycznych FCM dotyczących wiadomości o wysokim priorytecie.

W przypadku wiadomości, które nie generują powiadomień, na przykład umożliwiają aktualizowanie zawartości aplikacji w tle lub inicjowanie synchronizacji danych, używaj wiadomości o zwykłym priorytecie z FCM. Wiadomości o normalnym priorytecie są dostarczane natychmiast, jeśli urządzenie nie jest w trybie uśpienia. Jeśli urządzenie jest w trybie uśpienia, są dostarczane w okresowych okresach konserwacji lub zaraz po wybudzeniu urządzenia przez użytkownika.

Zgodnie ze sprawdzoną metodą zalecamy używanie FCM, jeśli aplikacja wymaga przesyłania wiadomości z wyprzedzeniem. Jeśli Twoja aplikacja korzysta już z FCM, upewnij się, że używa ona wiadomości o wysokim priorytecie tylko w przypadku wiadomości, które otrzymują powiadomienia widoczne dla użytkowników.

Pomoc w innych przypadkach użycia

Prawie wszystkie aplikacje obsługują Uśpienie, zarządzając połączeniami sieciowymi, alarmami, zadaniami i synchronizacją oraz używając wiadomości FCM. Ta opcja może być niewystarczająca w przypadku wąskiego zakresu zastosowań. W takich przypadkach system udostępnia konfigurowalną listę aplikacji, które są częściowo wykluczone z optymalizacji funkcji Uśpienie i Czuwanie aplikacji.

Aplikacja, która jest częściowo wykluczona, może używać sieci i utrzymywać częściowe blokady uśpienia w trybie uśpienia i czuwania aplikacji. Aplikacja nadal podlega jednak innym ograniczeniom, tak jak do innych aplikacji. Na przykład zadania i synchronizacje aplikacji są odroczone do poziomu interfejsu API 23 i niższego, a zwykłe alarmy typu AlarmManager nie są uruchamiane. Aplikacja może sprawdzić, czy znajduje się obecnie na liście wykluczeń, wywołując funkcję isIgnoringBatteryOptimizations().

Użytkownicy mogą ręcznie skonfigurować listę wykluczonych aplikacji, klikając Ustawienia > Bateria > Optymalizacja baterii. Aplikacje mogą też prosić użytkowników o zwolnienie z obowiązku spełniania wymogów tych zasad przez system:

Aplikacja może sprawdzić, czy znajduje się na liście wykluczeń, wywołując isIgnoringBatteryOptimizations().

Testowanie w trybie uśpienia i gotowości aplikacji

Aby zadbać o komfort użytkowników, przetestuj ją w pełni w trybie Uśpienie i Czuwanie aplikacji.

Przetestuj aplikację w Doze

Możesz to sprawdzić, wykonując te czynności:

  1. Skonfiguruj urządzenie lub urządzenie wirtualne z obrazem systemu Android 6.0 (poziom interfejsu API 23) lub nowszym.
  2. Połącz urządzenie z komputerem programisty i zainstaluj aplikację.
  3. Uruchom aplikację i pozostaw ją aktywną.
  4. Wymuszaj tryb bezczynności systemu, uruchamiając to polecenie:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Gdy wszystko będzie gotowe, zakończ tryb bezczynności, uruchamiając to polecenie:
        $ adb shell dumpsys deviceidle unforce
        
  6. Ponownie aktywuj urządzenie, wykonując to polecenie:
        $ adb shell dumpsys battery reset
        
  7. Po ponownym aktywowaniu urządzenia obserwuj działanie aplikacji. Upewnij się, że aplikacja przywraca się sprawnie po wyjściu z funkcji Uśpienie.

Testowanie aplikacji w trybie gotowości aplikacji

Aby przetestować tryb czuwania aplikacji:

  1. Skonfiguruj urządzenie lub urządzenie wirtualne z obrazem systemu Android 6.0 (poziom interfejsu API 23) lub nowszym.
  2. Połącz urządzenie z komputerem programisty i zainstaluj aplikację.
  3. Uruchom aplikację i pozostaw ją aktywną.
  4. Wymuś tryb gotowości aplikacji, uruchamiając te polecenia:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Wykonaj symulację wybudzania aplikacji za pomocą tych poleceń:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Obserwuj zachowanie aplikacji po jej wybudzeniu. Sprawdź, czy aplikacja płynnie przywróciła się z trybu gotowości. W szczególności sprawdź, czy powiadomienia i zadania w tle działają zgodnie z oczekiwaniami.

Dopuszczalne przypadki użycia wykluczenia

W tabeli poniżej opisujemy kilka przypadków użycia i pokazujemy, czy w takich sytuacjach aplikacje mogą korzystać z zamiaru ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. Ogólnie rzecz biorąc, aplikacja nie spełnia tych wyjątków, chyba że funkcja uśpienia lub czuwania aplikacji zakłóca jej główną funkcję lub z przyczyn technicznych nie można korzystać z wiadomości o wysokim priorytecie FCM.

Więcej informacji znajdziesz w sekcji dotyczącej pomocy dotyczącej innych przypadków użycia.

Typ Przypadek użycia Czy można korzystać z FCM? Czy to zwolnienie jest dozwolone? Uwagi
Komunikator, czat lub aplikacja do rozmów. Wymaga dostarczania wiadomości w czasie rzeczywistym do użytkowników, gdy urządzenie jest w trybie uśpienia lub aplikacja jest w trybie czuwania. Tak, używam FCM Niedozwolone Używaj wiadomości o wysokim priorytecie w FCM do wybudzania aplikacji i uzyskania dostępu do sieci.
Tak, ale nie używa wiadomości o wysokim priorytecie w FCM.
Aplikacja do komunikatora, czatu lub rozmów; firmowe aplikacje do obsługi VOIP. Nie. Nie można korzystać z FCM ze względu na zależność techniczną od innej usługi do przesyłania wiadomości lub działanie funkcji Uśpienie i czuwanie aplikacji zakłóca działanie głównej funkcji aplikacji. Akceptowalna
Aplikacja Bezpieczeństwo. Aplikacje zapewniające bezpieczeństwo użytkowników i ich rodzin. W odpowiednich przypadkach. Akceptowalna
Aplikacja do automatyzacji zadań. Podstawową funkcją aplikacji jest planowanie zautomatyzowanych działań, takich jak komunikator, połączenia głosowe czy zarządzanie nowymi zdjęciami. W odpowiednich przypadkach. Akceptowalna
Aplikacja towarzysząca do urządzenia peryferyjnego. Podstawową funkcją aplikacji jest utrzymywanie stałego połączenia z urządzeniem peryferyjnym, by zapewnić temu urządzeniu dostęp do internetu. W odpowiednich przypadkach. Akceptowalna
Aplikacja musi okresowo łączyć się z urządzeniem peryferyjnym, aby przeprowadzić synchronizację, lub łączy się tylko z urządzeniami (takimi jak słuchawki bezprzewodowe) połączonymi przy użyciu standardowych profili Bluetooth. W odpowiednich przypadkach. Niedozwolone