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

Android ma 2 funkcje oszczędzania baterii, które wydłużają czas pracy na baterii, zarządzając zachowaniem aplikacji, gdy urządzenie nie jest podłączone do źródła zasilania: Doze i Tryb w oczekywaniu. Doze zmniejsza zużycie baterii, opóźniając w przypadku aplikacji aktywność procesora i sieci w tle, gdy urządzenie nie jest używane przez długi czas. Czuwanie aplikacji opóźnia aktywność sieciową w tle w przypadku aplikacji, które nie były ostatnio aktywne.

Gdy urządzenie jest w trybie uśpienia, dostęp aplikacji do niektórych zasobów obciążających baterię jest odroczony do czasu konserwacji. Szczegółowe ograniczenia są wymienione w ograniczeniach zarządzania zasilaniem.

Uśpienie i tryb gotowości aplikacji zarządzają działaniem wszystkich aplikacji działających na Androidzie 6.0 lub nowszym niezależnie od tego, czy są one kierowane konkretnie na poziom API 23. Aby zapewnić użytkownikom jak najlepsze wrażenia, przetestuj aplikację w trybie Doze i w trybie gotowości aplikacji oraz wprowadź w kodzie wszelkie niezbędne poprawki. W następnych sekcjach znajdziesz szczegółowe informacje.

Na czym polega uśpienie

Jeśli użytkownik pozostawi urządzenie odłączone i nie rusza się przez pewien czas z wyłączonym ekranem, urządzenie 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 obciążających procesor. Uniemożliwia też aplikacjom dostęp do sieci i opóźnia wykonywanie zadań, synchronizacji i standardowych alarmów.

Okresowo system na chwilę wyłącza uśpienie, aby umożliwić aplikacjom wykonanie odłożonych działań. W trakcie tego okresu konserwacji system uruchamia wszystkie oczekujące synchronizacje, zadania i alarmy oraz zezwala aplikacjom na dostęp do sieci.

Rysunek 1. Doze zapewnia cykliczne okno konserwacji, aby aplikacje mogły korzystać z sieci i obsługiwać oczekujące działania.

Po zakończeniu okresu konserwacji system ponownie przejdzie w tryb Doze, zawieszając dostęp do sieci oraz opóźniając zadania, synchronizacje i alarmy. Z czasem system rzadziej planuje okna konserwacyjne, co pomaga zmniejszyć zużycie baterii w przypadku dłuższego braku aktywności, gdy urządzenie nie jest ładowane.

Gdy użytkownik wybudzi urządzenie, poruszając je, włączając ekran lub podłączając ładowarkę, system wyłączy tryb uśpienia i wszystkie aplikacje wrócą do normalnej aktywności.

Ograniczenia dotyczące uśpienia

W trybie uśpienia system stosuje do aplikacji te ograniczenia:

Lista kontrolna uśpienia

Dostosowywanie aplikacji do funkcji Uśpienie

Doze może wpływać na aplikacje w różny sposób w zależności od ich funkcji i usług, z których korzystają. Wiele aplikacji działa normalnie bez modyfikacji, w trybie uśpienia. W niektórych przypadkach musisz zoptymalizować sposób, w jaki aplikacja zarządza siecią, alarmami, zadaniami i synchronizacją. Aplikacje muszą umożliwiać sprawne zarządzanie działaniami w okresie konserwacji.

Aby ułatwić sobie planowanie alarmów, możesz użyć 2 metod AlarmManager: setAndAllowWhileIdle() i setExactAndAllowWhileIdle(). Dzięki tym metodom możesz ustawiać alarmy, które uruchomią się nawet wtedy, gdy urządzenie jest uśpione.

Ograniczenie Doze dotyczące dostępu do sieci może również wpływać na Twoją aplikację, zwłaszcza jeśli korzysta ona z wiadomości w czasie rzeczywistym, takich jak powiadomienia. Jeśli aplikacja wymaga stałego połączenia z siecią, aby odbierać wiadomości, użyj w miarę możliwości Komunikacji w chmurze Firebase (FCM).

Aby sprawdzić, czy po włączeniu Uśpienia aplikacja działa zgodnie z oczekiwaniami, użyj poleceń adb, by wymusić na systemie włączenie i zamknięcie uśpienia, a także obserwowanie jej działania. Więcej informacji znajdziesz w artykule Testowanie trybu Doze i trybu wstrzymania aplikacji.

Informacje o trybie czuwania aplikacji

Tryb gotowości aplikacji pozwala systemowi określić, że aplikacja jest nieaktywna, gdy użytkownik nie korzysta z niej aktywnie. System podejmuje tę decyzję, gdy użytkownik nie dotyka aplikacji przez określony czas i nie spełnia się żaden z tych warunków:

  • Użytkownik samodzielnie uruchamia aplikację.
  • Aplikacja ma proces obecnie na pierwszym planie – jako działanie lub usługa na pierwszym planie albo w użyciu przez inną aktywność lub usługę na pierwszym planie.
  • Aplikacja wygeneruje powiadomienie, które użytkownicy zobaczą na ekranie blokady lub w obszarze powiadomień.

Gdy użytkownik podłącza urządzenie do zasilania, system uwalnia aplikacje ze stanu gotowości, umożliwiając im swobodny dostęp do sieci oraz wykonywanie oczekujących zadań i synchronizacji. Jeśli urządzenie jest nieaktywne przez długi czas, system zezwala aplikacjom na dostęp do sieci około raz dziennie.

Korzystaj z FCM, aby korzystać z aplikacji, gdy urządzenie jest bezczynne

FCM (Firebase Cloud Messaging) to usługa, która umożliwia komunikację w czasie rzeczywistym między usługami a aplikacjami na urządzeniach z Androidem w czasie rzeczywistym. FCM zapewnia jedno, trwałe połączenie z chmurą. Z takiego połączenia mogą korzystać wszystkie aplikacje, które wymagają przesyłania wiadomości w czasie rzeczywistym. To wspólne połączenie znacznie optymalizuje zużycie baterii, ponieważ wiele aplikacji nie musi utrzymywać własnych, oddzielnych stałych połączeń, które mogą szybko wyczerpywać baterię. Z tego powodu, jeśli Twoja aplikacja wymaga integracji z usługą backendową, zdecydowanie zalecamy użycie FCM zamiast utrzymywania własnego trwałego połączenia z internetem.

FCM jest zoptymalizowany pod kątem trybów uśpienia i gotowości aplikacji. Wiadomości FCM o wysokim priorytecie umożliwiają aktywowanie aplikacji w celu zaangażowania użytkownika. W trybie uśpienia lub czuwania aplikacji system dostarcza wiadomość i przyznaje aplikacji tymczasowy dostęp do usług sieciowych i częściowych blokad uśpienia, a następnie przywraca urządzenie lub aplikację do stanu bezczynności. W przypadku powiadomień, które są widoczne dla użytkownika i mają charakter pilny, rozważ użycie wiadomości o wysokim priorytecie, aby umożliwić ich dostarczanie w trybie Doze. Wiadomości o wysokim priorytecie mogą powodować powiadomienia. Więcej informacji znajdziesz w wskazówkach FCM dotyczących wiadomości o wysokim priorytecie.

W przypadku wiadomości, które nie powodują wyświetlania powiadomień, takich jak wiadomości dotyczące aktualizowania treści aplikacji w tle lub inicjowania synchronizacji danych, używaj wiadomości FCM o normalnym priorytecie. Wiadomości o normalnym priorytecie są dostarczane natychmiast, gdy urządzenie nie jest uśpione. Jeśli urządzenie jest w trybie uśpienia, jest włączane w okresie okresowych konserwacji lub zaraz po wybudzeniu urządzenia przez użytkownika.

Ogólnie sprawdzoną metodą jest użycie FCM, jeśli aplikacja wymaga wysyłania wiadomości do klienta. Jeśli aplikacja korzysta już z FCM, upewnij się, że wiadomości o wysokim priorytecie są używane tylko w przypadku wiadomości, które prowadzą do wyświetlenia powiadomienia użytkownikowi.

Pomoc do innych zastosowań

Prawie wszystkie aplikacje mogą obsługiwać Doze, zarządzając połączeniem z siecią, alarmami, zadaniami i synchronizacją oraz korzystając z wiadomości FCM. W przypadku wąskiego zbioru przypadków użycia może to być niewystarczające. W takich przypadkach system udostępnia konfigurowalną listę aplikacji, które są częściowo wyłączone z optymalizacji trybu Doze i trybu w stanie gotowości.

Aplikacja, która jest częściowo zwolniona z tych ograniczeń, może korzystać z sieci i utrzymywać częściowe blokady uśpienia podczas Uśpienia i Czuwania aplikacji. Tak jak w przypadku innych aplikacji nadal obowiązują inne ograniczenia. Na przykład zadania i synchronizacje aplikacji są opóźnione na poziomie interfejsu API 23 i niżej, a jej zwykłe alarmy AlarmManager nie są uruchamiane. Aplikacja może sprawdzić, czy znajduje się obecnie na liście wyjątków, wywołując funkcję isIgnoringBatteryOptimizations().

Użytkownicy mogą ręcznie skonfigurować listę wykluczonych aplikacji w sekcji Ustawienia > Bateria > Optymalizacja baterii. System umożliwia też aplikacjom wysyłanie użytkownikom próśb o wyjątek:

Aplikacja może sprawdzić, czy znajduje się obecnie na liście wyjątków, wywołując funkcję isIgnoringBatteryOptimizations().

Testowanie za pomocą funkcji Uśpienie i Czuwanie aplikacji

Aby zapewnić użytkownikom wygodę, przetestuj aplikację w trybie Doze i w trybie czuwania aplikacji.

Testowanie aplikacji za pomocą funkcji Uśpienie

Aby przetestować tryb uśpienia, wykonaj te czynności:

  1. Skonfiguruj urządzenie sprzętowe lub urządzenie wirtualne z obrazem systemu Android 6.0 (poziom interfejsu API 23) lub nowszym.
  2. Podłącz urządzenie do komputera i zainstaluj aplikację.
  3. Uruchom aplikację i nie wyłączaj jej.
  4. Wymuś tryb bezczynności systemu, uruchamiając to polecenie:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Gdy wszystko będzie gotowe, wyjdź z trybu 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. Przyjrzyj się działaniu aplikacji po ponownym włączeniu urządzenia. Upewnij się, że po zamknięciu urządzenia aplikacja będzie sprawnie przywracana do stanu fabrycznego.

Testowanie aplikacji za pomocą funkcji App Standby

Aby przetestować tryb gotowości aplikacji, wykonaj te czynności:

  1. Skonfiguruj urządzenie lub urządzenie wirtualne z obrazem systemu z Androidem 6.0 (poziom interfejsu API 23) lub nowszym.
  2. Podłącz urządzenie do komputera i zainstaluj aplikację.
  3. Uruchom aplikację i pozostaw ją aktywną.
  4. Wymuś przejście aplikacji w tryb gotowości, wykonując te polecenia:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Symuluj budzenie aplikacji za pomocą tych poleceń:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Obserwuj zachowanie aplikacji po jej uruchomieniu. Upewnij się, że aplikacja płynnie przechodzi do trybu gotowości. W szczególności sprawdź, czy powiadomienia i zadania w tle w aplikacji działają zgodnie z oczekiwaniami.

Dopuszczalne przypadki użycia uprawnienia do zwolnienia

W tabeli poniżej opisaliśmy kilka przypadków użycia oraz wskazaliśmy, czy w tych sytuacjach akceptowalne jest używanie przez aplikacje działania ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSintent. Ogólnie rzecz biorąc, Twoja aplikacja nie spełnia tych wyjątków, chyba że Doze lub tryb czuwania aplikacji zakłócają jej główną funkcjonalność lub istnieje techniczny powód, dla którego aplikacja nie może korzystać z wiadomości FCM o wysokiej priorytecie.

Więcej informacji znajdziesz w artykule Więcej informacji o obsłudze innych przypadków użycia.

Typ Przypadek użycia Czy można używać FCM? Czy to zwolnienie jest dozwolone? Uwagi
komunikator internetowy, czat lub aplikacje do połączeń; Wymaga dostarczania użytkownikom wiadomości w czasie rzeczywistym, gdy urządzenie jest w trybie uśpienia lub gdy aplikacja jest w trybie gotowości. Tak, za pomocą FCM Niedopuszczalne Wysyłaj 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 Komunikacji w chmurze Firebase (FCM).
Aplikacja do komunikatora, czatu lub połączeń; firmowe aplikacje VOIP. Nie, nie można używać FCM ze względu na zależność techniczną od innej usługi do przesyłania wiadomości lub funkcje uśpienia i czuwania aplikacji zakłócają działanie głównej funkcji aplikacji. Akceptowalna
Aplikacja Bezpieczeństwo. Aplikacje, które zapewniają bezpieczeństwo użytkownikom i ich rodzinom. W odpowiednich przypadkach. Akceptowalna
Aplikacja do automatyzacji zadań. Główna funkcja aplikacji to planowanie zautomatyzowanych działań, takich jak wysyłanie wiadomości błyskawicznych, połączeń głosowych i zarządzanie nowymi zdjęciami. W odpowiednich przypadkach. Akceptowalna
Aplikacja towarzysząca urządzeniu peryferyjnemu. Podstawową funkcją aplikacji jest utrzymywanie trwałego połączenia z urządzeniem peryferyjnym na potrzeby zapewnienia mu dostępu do internetu. W odpowiednich przypadkach. Akceptowalna
Aplikacja musi co jakiś czas łączyć się z urządzeniem peryferyjnym, aby przeprowadzić synchronizację, lub łączyć się tylko z urządzeniami (takimi jak słuchawki bezprzewodowe) połączonymi przez standardowe profile Bluetooth. W odpowiednich przypadkach. Niedopuszczalne