Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, a użytkownik nie wchodzi z nią w interakcję przez kilka miesięcy, system przeniesie ją w stan hibernacji. System optymalizuje pod kątem ilości miejsca, a nie wydajności, a system chroni dane użytkownika. To działanie systemu przypomina działanie, gdy użytkownik ręcznie wymusi zatrzymanie aplikacji w ustawieniach systemu.
Skutki hibernacji
Jak pokazano w tabeli 1, efekty hibernacji zależą od docelowej wersji pakietu SDK aplikacji oraz od urządzenia, na którym działa aplikacja:
Wersja docelowego pakietu SDK | Cechy urządzenia | Efekty hibernacji |
---|---|---|
Android 12 lub nowszy | ma zainstalowanego Androida 12 lub nowszego, |
Uprawnienia czasu działania aplikacji zostaną zresetowane. To działanie ma taki sam skutek jak gdyby użytkownik wyświetlił uprawnienie w ustawieniach systemu i zmienił poziom dostępu aplikacji na Odmów. Aplikacja nie może uruchamiać zadań ani alertów w tle. Twoja aplikacja nie może otrzymywać powiadomień push, w tym wiadomości o wysokim priorytecie wysyłanych przez Komunikację w chmurze Firebase. Wszystkie pliki w pamięci podręcznej aplikacji zostaną usunięte. |
Android 11 | Android 11 | Uprawnienia czasu działania aplikacji zostały zresetowane. |
Android 11 | Działa od Androida 6.0 (poziom interfejsu API 23) do Androida 10 (poziom interfejsu API 29) włącznie i korzysta z Usług Google Play |
Uprawnienia czasu działania aplikacji zostały zresetowane. Ta zmiana wejdzie w życie w grudniu 2021 r. Więcej informacji o udostępnianiu automatycznego resetowania uprawnień na miliardach urządzeń znajdziesz w tym poście na blogu. |
Zachowanie systemu po wyjściu aplikacji ze stanu hibernacji
Gdy użytkownik wejdzie w interakcję z aplikacją, wyjdzie ze stanu hibernacji i będzie mogła ponownie tworzyć zadania, alerty i powiadomienia.
System nie wykona jednak tych czynności:
Ponownie przyznaj uprawnienia w czasie działania aplikacji.
Użytkownik musi ponownie przyznać te uprawnienia aplikacji.
Zmień harmonogram wszystkich zadań, alertów i powiadomień zaplanowanych przed przejściem aplikacji w stan hibernacji.
Aby ułatwić sobie obsługę tego przepływu pracy, użyj WorkManagera. Możesz również dodać mechanizm zmiany harmonogramu w odbiorniku transmisji radiowej
ACTION_BOOT_COMPLETED
, który jest wywoływany, gdy aplikacja przechodzi w stan hibernacji i po włączeniu urządzenia.
Transmisja danych w aplikacjach
W sekcjach poniżej znajdziesz przykłady użycia aplikacji oraz przykłady działań, których system nie uznaje za używanie aplikacji.
Przykłady użycia aplikacji
Po wznowieniu działania w aplikacji system uznaje to zdarzenie za interakcję użytkownika. Dlatego system wydłuża czas, po którym aplikacja przechodzi w stan hibernacji.
W Androidzie 11 i nowszych za interakcje użytkowników uważa się również te zachowania:
- Użytkownik wchodzi w interakcję z widżetem.
Użytkownik wchodzi w interakcję z powiadomieniem, oprócz zamknięcia powiadomienia.
Warto zauważyć, że korzystanie z aplikacji do hibernacji nie wymaga bezpośredniej interakcji użytkownika. O ile wywoływany jest komponent pakietu, nadal jest to uważane za wykorzystanie w aplikacji. Oto kilka przykładów:
- aplikacje, których dostawca usług lub treści jest powiązany z inną aplikacją na urządzeniu lub w systemie operacyjnym. Mogą to być na przykład edytory metod wprowadzania (IME) lub menedżery haseł.
Odbiorniki w pakiecie odbierające wprost transmisję z pakietu zewnętrznego.
Elementy inne niż przykłady
Jeśli w Twojej aplikacji występują tylko zachowania opisane na tej liście, po kilku miesiącach przechodzi w stan hibernacji:
- Uruchamia zaplanowane zadanie za pomocą narzędzia
JobScheduler
. - Otrzymuje niejawną transmisję.
- Ustawia alarmy.
Wykluczenia systemu z hibernacji
W niektórych przypadkach Android umożliwia zwolnienie na poziomie systemu z hibernacji aplikacji. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona z standardów użytkowania i nie będzie w stanie hibernacji.
- Aplikacje niewyświetlane w Menu z aplikacjami
- Każda aplikacja, która nie ma aktywnego kafelka skrótów w programie uruchamiającym.
- Aplikacje z profilu służbowego
- Dowolna aplikacja, którą użytkownik zainstaluje w profilu służbowym. Pamiętaj, że jeśli ta sama aplikacja znajduje się też w profilu osobistym, tylko aplikacja z profilem służbowym jest objęta wyjątkiem.
- Kontrolery zasad dotyczących urządzeń
- Aplikacje umożliwiające sterowanie lokalnymi zasadami dotyczącymi urządzeń i aplikacjami systemowymi na urządzeniach.
- Aplikacje z podwyższonymi uprawnieniami operatora
- Każda aplikacja, którą operatorzy sieci komórkowych wstępnie ładują na urządzeniach i które mogą zostać uznane za niezbędne ze względu na zobowiązania umowne, np. poczta głosowa lub obsługa klienta.
- Instalatory aplikacji innych firm
- Sklepy z aplikacjami innych firm w razie potrzeby automatycznie aktualizują zainstalowane aplikacje.
Zwolnienia użytkowników z hibernacji
Jeśli spodziewasz się, że hibernacja dotyczy głównego przypadku użycia Twojej aplikacji, możesz poprosić użytkownika o zwolnienie z hibernacji aplikacji. Takie wykluczenie jest przydatne w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet jeśli nie wejdzie z nią w interakcję, np. gdy:
- Zadbaj o bezpieczeństwo rodziny, okresowo zgłaszając lokalizację jej członków.
- Synchronizowanie danych między urządzeniem a serwerem aplikacji.
- komunikować się z urządzeniami smart, takimi jak telewizor;
- Sparuj z urządzeniami towarzyszącymi, takimi jak zegarek.
Aby poprosić o zwolnienie, wykonaj czynności opisane w poniższych sekcjach.
Sprawdzanie, czy użytkownik wyłączył hibernację w aplikacji
Aby sprawdzić, czy użytkownik wyłączył hibernację w Twojej aplikacji, użyj interfejsu API getUnusedAppRestrictionsStatus()
.
Więcej informacji na temat korzystania z tego interfejsu API w aplikacji znajdziesz w przykładowym kodzie API na tej stronie.
Poproś użytkownika o wyłączenie hibernacji w Twojej aplikacji
Jeśli użytkownik nie wyłączył jeszcze hibernacji w Twojej aplikacji, możesz wysłać do niego prośbę. W tym celu wykonaj następujące czynności:
- Wyświetl interfejs wyjaśniający użytkownikowi, dlaczego musi wyłączyć hibernację w aplikacji.
-
Wywołaj interfejs API
createManageUnusedAppRestrictionsIntent()
, jak pokazano w przykładowym kodzie API. Ten interfejs API tworzy intencję, która wczytuje w Ustawieniach ekran Informacje o aplikacji. Tutaj użytkownik może wyłączyć hibernację w aplikacji.Wysyłając tę intencję, należy wywołać funkcję
startActivityForResult()
, a niestartActivity()
.Jak widać w tabeli 2, lokalizacja i nazwa opcji zależą od charakterystyki urządzenia, na którym aplikacja jest zainstalowana:
Tabela 2. Opcja wyłączająca hibernację aplikacji Cechy urządzenia Strona, na której pojawia się ta opcja Nazwa opcji, którą chcesz wyłączyć ma zainstalowanego Androida 13 lub nowszego, Informacje o aplikacji Wstrzymywanie nieużywanej aktywności w aplikacjach Android 12 Informacje o aplikacji Odbieranie uprawnień i zwolnienie miejsca Android 11 Informacje o aplikacji > Uprawnienia Odbieranie uprawnień, jeśli aplikacja nie jest używana ma Androida w wersji od 6.0 do 10 włącznie i obsługuje Usługi Google Play. Aplikacja Google Play > Menu > Play Protect > Uprawnienia nieużywanych aplikacji Odbieranie uprawnień, jeśli aplikacja nie jest używana
Przykład kodu API
Z tego przykładowego kodu dowiesz się, jak sprawdzić, czy hibernacja jest włączona w aplikacji, i jak w prawidłowy sposób poprosić użytkowników o jej wyłączenie.
Kotlin
val future: ListenableFuture<Int> = PackageManagerCompat.getUnusedAppRestrictionsStatus(context) future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context)) fun onResult(appRestrictionsStatus: Int) { when (appRestrictionsStatus) { // Couldn't fetch status. Check logs for details. ERROR -> { } // Restrictions don't apply to your app on this device. FEATURE_NOT_AVAILABLE -> { } // The user has disabled restrictions for your app. DISABLED -> { } // If the user doesn't start your app for a few months, the system will // place restrictions on it. See the API_* constants for details. API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus) } } fun handleRestrictions(appRestrictionsStatus: Int) { // If your app works primarily in the background, you can ask the user // to disable these restrictions. Check if you have already asked the // user to disable these restrictions. If not, you can show a message to // the user explaining why permission auto-reset or app hibernation should be // disabled. Then, redirect the user to the page in system settings where they // can disable the feature. val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName) // You must use startActivityForResult(), not startActivity(), even if // you don't use the result code returned in onActivityResult(). startActivityForResult(intent, REQUEST_CODE) }
Interfejs API starszej platformy
System operacyjny ma również interfejs API do interakcji z funkcją hibernacji. Interfejs API działa jednak tylko na urządzeniach z Androidem 11 lub nowszym. Nie obsługuje funkcji hibernacji, które są przeniesione do wcześniejszych wersji Androida. Dlatego nie zalecamy korzystania z niego.
Jeśli chcesz tymczasowo nadal używać tego interfejsu API, aby zadbać o zgodność, poniżej znajdziesz informacje o tym, jak z niego korzystać:
- Aby sprawdzić, czy hibernacja jest wyłączona w aplikacji:
isAutoRevokeWhitelisted()
- Aby przekierować użytkownika na stronę ustawień hibernacji: utwórz intencję za pomocą narzędzia
ACTION_APPLICATION_DETAILS_SETTINGS
.
Ręczne wywoływanie hibernacji
Aby sprawdzić, jak aplikacja zachowuje się po tym, jak system przejdzie w stan hibernacji, wykonaj te czynności:
(Tylko Android 12 i nowsze wersje) Włącz hibernację na urządzeniu:
adb shell device_config put app_hibernation app_hibernation_enabled true
Ustaw domyślny czas oczekiwania systemu na przejście w hibernację. Dzięki temu po zakończeniu testów możesz go przywrócić:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Skróć czas oczekiwania systemu. W poniższym przykładzie system został zmodyfikowany tak, że aplikacja przechodzi w stan hibernacji tylko sekundę po tym, jak przestajesz z niej korzystać:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Poczekaj na zakończenie wszelkich transmisji na urządzeniu testowym, uruchamiając to polecenie:
adb shell am wait-for-broadcast-idle
Po zakończeniu transmisji to polecenie zwraca komunikat:
All broadcast queues are idle!
Ręcznie wywołaj proces hibernacji aplikacji:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(Tylko Android 12 i nowsze wersje) Sprawdź, czy aplikacja jest zahibernowana, korzystając z jednej z tych metod:
- Zwróć uwagę, że urządzenie testowe wyświetla teraz powiadomienie, że nieużywane aplikacje są w stanie hibernacji.
Uruchom to polecenie:
adb shell cmd app_hibernation get-state PACKAGE-NAME
Przywróć domyślny czas oczekiwania systemu przed przeniesieniem aplikacji w stan hibernacji:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold