Android ma 2 funkcje oszczędzania energii, 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: drzemkę i czuwanie aplikacji. Doze zmniejsza zużycie baterii, odraczając aktywność procesora i aktywność sieciową w tle w przypadku aplikacji, gdy urządzenie nie jest używane przez dłuższy czas. Czuwanie aplikacji opóźnia aktywność sieciową w tle w przypadku aplikacji, które nie wykazują ostatniej aktywności użytkownika.
Gdy urządzenie jest w trybie uśpienia, dostęp aplikacji do niektórych zasobów, które zużywają dużo energii, jest odroczony do czasu okna konserwacji. Konkretne ograniczenia są wymienione w artykule Ograniczenia zarządzania zasilaniem.
Funkcje Doze i Czuwanie aplikacji zarządzają działaniem wszystkich aplikacji na Androidzie 6.0 lub nowszym, niezależnie od tego, czy są one kierowane na interfejs API na poziomie 23. Aby zapewnić użytkownikom jak najlepsze wrażenia, przetestuj aplikację w trybach drzemki i czuwania oraz wprowadź niezbędne zmiany w kodzie. Szczegółowe informacje znajdziesz w sekcjach poniżej.
Informacje o funkcji Doze
Jeśli użytkownik pozostawi urządzenie odłączone i nieruchome 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 sieci i usług obciążających procesor. Uniemożliwia też aplikacjom dostęp do sieci i odracza ich zadania, synchronizacje i standardowe alarmy.
System okresowo wychodzi z trybu uśpienia na krótki czas, aby umożliwić aplikacjom wykonanie odłożonych działań. Podczas tego okna konserwacji system uruchamia wszystkie oczekujące synchronizacje, zadania i alarmy oraz umożliwia aplikacjom dostęp do sieci.
Po zakończeniu okna konserwacji system ponownie przechodzi w tryb uśpienia, zawieszając dostęp do sieci i odraczając zadania, synchronizacje i alarmy. Z czasem system planuje okresy konserwacji rzadziej, co pomaga zmniejszyć zużycie baterii w przypadku dłuższej bezczynności, gdy urządzenie nie jest ładowane.
Gdy użytkownik wybudzi urządzenie, poruszając nim, włączając ekran lub podłączając ładowarkę, system wyjdzie z trybu uśpienia, a wszystkie aplikacje wznowią normalne działanie.
Ograniczenia trybu uśpienia
W trybie drzemki system stosuje do aplikacji te ograniczenia:
- zawiesza dostęp do sieci,
- Ignoruje blokady uśpienia.
- Odkłada standardowe alarmy
AlarmManager, w tymsetExact()isetWindow(), do następnego okresu konserwacji.- Jeśli chcesz ustawić alarmy, które będą się uruchamiać w trybie uśpienia, użyj
setAndAllowWhileIdle()lubsetExactAndAllowWhileIdle(). - Alarmy ustawione za pomocą aplikacji
setAlarmClock()będą nadal działać normalnie. System wyłącza drzemkę na krótko przed uruchomieniem tych alarmów.
- Jeśli chcesz ustawić alarmy, które będą się uruchamiać w trybie uśpienia, użyj
- Nie skanuje sieci Wi-Fi.
- Nie zezwala na działanie adapterów synchronizacji.
- Nie zezwala na uruchamianie aplikacji
JobScheduler.
Lista kontrolna dotycząca trybu uśpienia
- Jeśli to możliwe, do wysyłania wiadomości do urządzeń używaj Komunikacji w chmurze Firebase (FCM).
- Jeśli użytkownicy muszą natychmiast zobaczyć powiadomienie, użyj typu wiadomości
RemoteNotification. Więcej informacji znajdziesz w dokumentacji FCM dotyczącej typu wiadomościRemoteNotification. - Podaj wystarczające informacje w początkowym ładunku wiadomości, aby nie było konieczne późniejsze uzyskiwanie dostępu do sieci.
- Ustaw alarmy krytyczne za pomocą
setAndAllowWhileIdle()isetExactAndAllowWhileIdle(). - Przetestuj aplikację w trybie uśpienia.
Dostosowywanie aplikacji do trybu uśpienia
Funkcja Doze może wpływać na aplikacje w różny sposób, w zależności od oferowanych przez nie możliwości i używanych usług. Wiele aplikacji działa normalnie w cyklach uśpienia bez żadnych modyfikacji. W niektórych przypadkach musisz zoptymalizować sposób, w jaki aplikacja zarządza siecią, alarmami, zadaniami i synchronizacją. Aplikacje muszą być w stanie efektywnie zarządzać działaniami podczas każdego okresu konserwacji.
Aby ułatwić planowanie alarmów, możesz użyć 2 metod AlarmManager: setAndAllowWhileIdle() i setExactAndAllowWhileIdle(). Dzięki tym metodom możesz ustawiać alarmy,
które będą się uruchamiać nawet wtedy, gdy urządzenie jest w trybie Doze.
Ograniczenie dostępu do sieci w trybie drzemki może też mieć wpływ na 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 otrzymywać wiadomości, w miarę możliwości używaj Komunikacji w chmurze Firebase (FCM).
Aby sprawdzić, czy aplikacja działa zgodnie z oczekiwaniami w trybie uśpienia, możesz użyć poleceń adb, aby wymusić przejście systemu w tryb uśpienia i wyjście z niego, i obserwować zachowanie aplikacji. Szczegółowe informacje znajdziesz w artykule Testowanie z użyciem funkcji Doze i Czuwanie aplikacji.
Czym jest czuwanie aplikacji
Czuwanie 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 korzysta z aplikacji przez określony czas i nie jest spełniony żaden z tych warunków:
- Użytkownik bezpośrednio uruchamia aplikację.
- Aplikacja ma proces, który jest obecnie na pierwszym planie, jako aktywność lub usługa na pierwszym planie, albo jest używany przez inną aktywność lub usługę na pierwszym planie.
- Aplikacja generuje powiadomienie, które użytkownicy widzą na ekranie blokady lub w obszarze powiadomień.
Gdy użytkownik podłączy urządzenie do źródła zasilania, system wyłączy stan gotowości aplikacji, umożliwiając im swobodny dostęp do sieci oraz wykonywanie 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.
Korzystanie z FCM do interakcji z aplikacją, gdy urządzenie jest bezczynne
Komunikacja w chmurze Firebase (FCM) to usługa działająca w chmurze i na urządzeniu, która umożliwia obsługę przesyłania wiadomości w czasie rzeczywistym między usługami backendu a aplikacjami na urządzeniach z Androidem. FCM zapewnia jedno, stałe połączenie z chmurą. Wszystkie aplikacje, które wymagają komunikacji w czasie rzeczywistym, mogą korzystać z tego połączenia. To udostępnione połączenie znacznie optymalizuje zużycie baterii, ponieważ eliminuje konieczność utrzymywania przez wiele aplikacji własnych, oddzielnych, stałych połączeń, które mogą szybko rozładowywać baterię. Dlatego jeśli Twoja aplikacja wymaga integracji wiadomości z usługą backendu, zdecydowanie zalecamy korzystanie z FCM, jeśli to możliwe, zamiast utrzymywania własnego stałego połączenia sieciowego.
FCM jest zoptymalizowany pod kątem trybów bezczynności Doze i Czuwanie aplikacji. Typ wiadomości FCM RemoteNotification pozwala wybudzić aplikację, aby zaangażować użytkownika. W trybie drzemki lub czuwania aplikacji system dostarcza wiadomość i przyznaje aplikacji tymczasowy dostęp do usług sieciowych oraz 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 wymagają szybkiego dostarczenia, rozważ użycie typów wiadomości RemoteNotification, aby umożliwić dostarczanie w trybie uśpienia. Te wiadomości mogą powodować wyświetlanie powiadomień. Więcej informacji znajdziesz we
wskazówkach FCM dotyczących RemoteNotification.
W przypadku wiadomości, które nie powodują wyświetlania powiadomień, takich jak aktualizowanie treści aplikacji w tle lub inicjowanie synchronizacji danych, używaj wiadomości FCM BackgroundSync. Te wiadomości mają celowo niski priorytet i mogą być opóźnione lub ograniczane, aby zoptymalizować zużycie baterii urządzenia.
Jeśli Twoja aplikacja wymaga przesyłania wiadomości do użytkowników, zalecamy korzystanie z FCM. Jeśli Twoja aplikacja korzysta już z FCM, upewnij się, że używa RemoteNotification w przypadku wiadomości, które powodują wyświetlanie powiadomień dla użytkownika.
Nie używaj znaczników RemoteNotification w tych sytuacjach:
- Kiedy powiadomienie na pewno nie zostanie wyświetlone.
- Do natychmiastowego dostarczania wiadomości, które tylko aktualizują stan aplikacji, np. aktualizują zawartość aplikacji w tle lub inicjują synchronizację danych.
- jako sposób na poproszenie użytkownika o przyznanie uprawnień;
Obsługa innych przypadków użycia
Prawie wszystkie aplikacje mogą obsługiwać tryb uśpienia, zarządzając połączeniem sieciowym, alarmami, zadaniami i synchronizacją oraz korzystając z wiadomości FCM. W przypadku wąskiego zakresu zastosowań może to być niewystarczające. W takich przypadkach system udostępnia konfigurowalną listę aplikacji, które są częściowo wyłączone z optymalizacji w ramach funkcji Doze i Czuwanie aplikacji.
Aplikacja, która jest częściowo wyłączona, może korzystać z sieci i utrzymywać częściowe blokady uśpienia w trybach drzemki i czuwania aplikacji. Jednak inne ograniczenia nadal obowiązują
w aplikacji, tak jak w przypadku innych aplikacji. Na przykład zadania i synchronizacje aplikacji są odroczone na poziomie interfejsu API 23 i niższym, a zwykłe alarmy AlarmManager nie są uruchamiane. Aplikacja może sprawdzić, czy znajduje się obecnie na liście wyjątków, wywołując isIgnoringBatteryOptimizations().
Użytkownicy mogą ręcznie skonfigurować listę wykluczonych aplikacji w sekcji Ustawienia > Bateria > Optymalizacja baterii. System udostępnia też aplikacjom sposoby na poproszenie użytkowników o wyłączenie ich z tego mechanizmu:
- Większość aplikacji może wywołać intencję zawierającą
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS. - Aplikacje, które spełniają kryteria dopuszczalnego przypadku użycia, mogą zamiast tego wywołać intencję zawierającą działanie intencji
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, aby umożliwić użytkownikowi dodanie aplikacji bezpośrednio do listy wyjątków bez konieczności przechodzenia do ustawień systemowych.
Aplikacja może sprawdzić, czy znajduje się obecnie na liście wyjątków, wywołując funkcję isIgnoringBatteryOptimizations().
Testowanie z użyciem funkcji uśpienia i czuwania aplikacji
Aby zapewnić użytkownikom jak najlepsze wrażenia, przetestuj aplikację w trybie uśpienia i czuwania aplikacji.
Testowanie aplikacji z funkcją Doze
Aby przetestować tryb uśpienia:
- Skonfiguruj urządzenie lub urządzenie wirtualne z obrazem systemu Android 6.0 (poziom interfejsu API 23) lub nowszym.
- Podłącz urządzenie do komputera używanego do programowania i zainstaluj aplikację.
- Uruchom aplikację i pozostaw ją aktywną.
- Wymuś przejście systemu w tryb bezczynności, uruchamiając to polecenie:
$ adb shell dumpsys deviceidle force-idle - Gdy wszystko będzie gotowe, wyjdź z trybu bezczynności, uruchamiając to polecenie:
$ adb shell dumpsys deviceidle unforce - Ponownie aktywuj urządzenie, wykonując to polecenie:
$ adb shell dumpsys battery reset - Po ponownym aktywowaniu urządzenia obserwuj zachowanie aplikacji. Upewnij się, że aplikacja prawidłowo wznawia działanie, gdy urządzenie wychodzi z trybu drzemki.
Testowanie aplikacji z użyciem funkcji Czuwanie aplikacji
Aby przetestować tryb czuwania aplikacji, wykonaj te czynności:
- Skonfiguruj urządzenie lub urządzenie wirtualne z obrazem systemu Android 6.0 (poziom interfejsu API 23) lub nowszym.
- Podłącz urządzenie do komputera używanego do programowania i zainstaluj aplikację.
- Uruchom aplikację i pozostaw ją aktywną.
- Wymuś przejście aplikacji w tryb czuwania aplikacji, uruchamiając te polecenia:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true - Zasymuluj wybudzenie aplikacji za pomocą tych poleceń:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName> - Obserwuj zachowanie aplikacji po jej wybudzeniu. Upewnij się, że aplikacja prawidłowo wychodzi z trybu czuwania. W szczególności sprawdź, czy powiadomienia i zadania w tle działają zgodnie z oczekiwaniami.
Dopuszczalne przypadki użycia, które mogą być objęte wyjątkiem
W tabeli poniżej przedstawiono kilka przypadków użycia i informacje o tym, czy w tych sytuacjach aplikacje mogą używać działania intencji ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. Zasadniczo Twoja aplikacja nie spełnia tych wyjątków, chyba że Doze lub Czuwanie aplikacji zakłóca jej główną funkcję albo istnieje techniczny powód, dla którego aplikacja nie może używać wiadomości FCM RemoteNotification.
Więcej informacji znajdziesz w sekcji Pomoc w innych przypadkach użycia.
| Typ | Przypadek użycia | Czy można używać FCM? | Czy zwolnienie jest akceptowalne? | Uwagi |
|---|---|---|---|---|
| aplikacja do obsługi czatu lub połączeń; | 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 aplikacji. | Tak, za pomocą FCM | Niedozwolone | Używaj wiadomości FCM RemoteNotification, aby wybudzać aplikację i uzyskiwać dostęp do sieci. |
Tak, ale nie używa wiadomości FCM RemoteNotification. |
||||
| aplikacje do obsługi czatu lub połączeń, aplikacje VOIP dla firm; | Nie, nie mogę używać FCM ze względu na zależność techniczną od innej usługi przesyłania wiadomości lub funkcje Doze i Czuwanie aplikacji zakłócają działanie głównej funkcji aplikacji. | Dozwolone | ||
| aplikacja Bezpieczeństwo. | Aplikacje, które zapewniają bezpieczeństwo użytkownikom i ich rodzinom. | W odpowiednich przypadkach, | Dozwolone | |
| Aplikacja do automatyzacji zadań. | Główną funkcją aplikacji jest planowanie automatycznych działań, takich jak czat, połączenia głosowe czy zarządzanie nowymi zdjęciami. | W odpowiednich przypadkach, | Dozwolone | |
| Aplikacja towarzysząca do urządzenia peryferyjnego. | Główną funkcją aplikacji jest utrzymywanie stałego połączenia z urządzeniem peryferyjnym w celu zapewnienia mu dostępu do internetu. | W odpowiednich przypadkach, | Dozwolone | |
| Aplikacja musi tylko okresowo łączyć się z urządzeniem peryferyjnym w celu synchronizacji lub musi łączyć się tylko z urządzeniami, takimi jak słuchawki bezprzewodowe, połączonymi za pomocą standardowych profili Bluetooth. | W odpowiednich przypadkach, | Niedozwolone |