Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, a użytkownik przez kilka miesięcy nie korzysta z niej, system przeniesie ją w stan hibernacji. System optymalizuje miejsce na dane zamiast wydajności, a także chroni dane użytkowników. Takie zachowanie systemu jest podobne do tego, co dzieje się, gdy użytkownik ręcznie wymusza zatrzymanie aplikacji w ustawieniach systemu.
Skutki hibernacji
Jak widać w tabeli 1, efekty hibernacji zależą od docelowej wersji pakietu SDK aplikacji oraz urządzenia, na którym aplikacja jest uruchomiona:
Docelowa wersja pakietu SDK | Cechy urządzenia | Skutki hibernacji |
---|---|---|
Android 12 lub nowszy. | ma zainstalowanego Androida 12 lub nowszego, |
Uprawnienia w czasie wykonywania aplikacji są resetowane. 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 wykonywać zadań ani wysyłać alertów w tle. Aplikacja nie może otrzymywać powiadomień push, w tym wiadomości o wysokim priorytecie wysyłanych przez Komunikację w chmurze Firebase. Wszystkie pliki z pamięci podręcznej aplikacji zostaną usunięte. |
Android 11 | działa na Androidzie 11, | Uprawnienia czasu działania aplikacji są resetowane. |
Android 11 | musi działać na Androidzie w wersji od 6.0 (poziom interfejsu API 23) do 10 (poziom interfejsu API 29) włącznie i wykorzystywać Usługi Google Play; |
Uprawnienia czasu działania aplikacji są resetowane. Ta zmiana zacznie obowiązywać w grudniu 2021 r. Więcej informacji znajdziesz w tym poście na blogu na temat automatycznego resetowania uprawnień dostępnych dla miliardów dodatkowych urządzeń. |
Zachowanie systemu, gdy aplikacja wychodzi z hibernacji
Gdy użytkownik ponownie wejdzie w interakcję z aplikacją, aplikacja wyjdzie z stanu hibernacji i znów będzie mogła tworzyć zadania, alerty i powiadomienia.
System nie wykonuje jednak tych czynności:
ponownie przyznać uprawnienia aplikacji na czas jej działania.
Użytkownik musi ponownie przyznać te uprawnienia Twojej aplikacji.
Zmień harmonogram zadań, alertów i powiadomień, które zostały zaplanowane przed przejściem aplikacji w stan hibernacji.
Aby ułatwić ten proces, użyj interfejsu WorkManager. Możesz też dodać logikę przeplanowania w odbiornikach transmisji
ACTION_BOOT_COMPLETED
, która jest wywoływana, gdy aplikacja wychodzi z stanu hibernacji po uruchomieniu urządzenia.
Transmisja danych w aplikacjach
W następnych sekcjach znajdziesz przykłady korzystania z aplikacji oraz przykłady działań, które system nie uznaje za korzystanie z aplikacji.
Przykłady użycia aplikacji
Gdy działalność w aplikacji zostanie wznowiona, system uzna to zdarzenie za interakcję użytkownika. Dlatego system wydłuża czas, zanim aplikacja przejdzie w stan hibernacji.
W Androidzie 11 i nowszych te działania są też uznawane za interakcje użytkowników:
- Użytkownik wchodzi w interakcję z widżetem.
Użytkownik wchodzi w interakcję z powiadomieniem, z wyjątkiem jego zamknięcia powiadomienia.
Należy pamiętać, że korzystanie z aplikacji w trybie hibernacji nie wymaga wyraźnej interakcji użytkownika. Dopóki wywoływany jest jakiś element pakietu, nadal jest to uznawane za korzystanie z aplikacji. Oto kilka przykładów:
- Aplikacje, które mają usługę lub dostawcę treści powiązane z inną aplikacją na urządzeniu lub systemie operacyjnym. Na przykład edytory metody wprowadzania (IME) lub menedżery haseł.
Odbiorniki transmisji w pakiecie odbierające transmisję z pakietu zewnętrznego.
Przykłady niespełniające kryteriów
Jeśli aplikacja wykazuje tylko zachowania opisane na tej liście, po kilku miesiącach przechodzi w stan hibernacji:
- Uruchamia zaplanowane zadanie za pomocą
JobScheduler
. - Otrzymuje domyślną transmisję.
- Planuje alarmy.
Wyjątki od hibernacji
W niektórych przypadkach Android zezwala na wyłączenie hibernacji aplikacji na poziomie systemu. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona z standardów korzystania z aplikacji i nie będzie przechodzić w stan uśpienia.
- Aplikacje nie wyświetlają się w Menu z aplikacjami
- Wszystkie aplikacje, które nie mają aktywnej ikony skrótu w menu.
- Aplikacje w profilu służbowym
- Wszelkie aplikacje zainstalowane przez użytkownika na profilu służbowym. Pamiętaj, że jeśli ta sama aplikacja znajduje się też na profilu osobistym, wyjątek dotyczy tylko aplikacji na profilu służbowym.
- Kontrolery zasad dotyczących urządzeń
- Aplikacje, które kontrolują zasady urządzeń lokalnych i aplikacje systemowe na urządzeniach.
- Aplikacje z uprawnieniami operatora
- Wszelkie aplikacje wstępnie zainstalowane przez operatorów telefonii komórkowych na urządzeniach i uznane za niezbędne do spełnienia zobowiązań wynikających z umowy, na przykład aplikacje poczty głosowej lub obsługi klienta.
- Aplikacje instalujące innych firm
- Sklepy innych firm z aplikacjami, które w razie potrzeby automatycznie aktualizują zainstalowane aplikacje.
Wyjątki dotyczące użytkowników z hibernacji
Jeśli przewidujesz, że tryb hibernacji może mieć wpływ na główny przypadek użycia aplikacji, możesz poprosić użytkownika o zwolnienie z trybu hibernacji aplikacji. Ta wytyczna jest przydatna w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet bez interakcji z aplikacją, na przykład gdy aplikacja wykonuje jedną z tych czynności:
- zapewnić bezpieczeństwo rodzinie, okresowo przekazując informacje o lokalizacji członków grupy rodzinnej.
- Synchronizowanie danych między urządzeniem a serwerem aplikacji.
- komunikować się z urządzeniami smart, takimi jak telewizor.
- sparować z urządzeniami towarzyszącymi, takimi jak zegarek.
Aby poprosić o wyjątek, wykonaj czynności opisane w następnych sekcjach.
Sprawdź, czy użytkownik wyłączył już hibernację Twojej aplikacji
Aby sprawdzić, czy użytkownik wyłączył już hibernację Twojej aplikacji, użyj interfejsu API getUnusedAppRestrictionsStatus()
.
Więcej informacji o korzystaniu z tego interfejsu API w aplikacji znajdziesz w przykładzie kodu API na tej stronie.
Prośba o wyłączenie hibernacji aplikacji
Jeśli użytkownik nie wyłączył jeszcze hibernacji dla Twojej aplikacji, możesz wysłać do niego prośbę. Aby to zrobić, wykonaj te czynności:
- Wyświetl interfejs użytkownika, który wyjaśnia, dlaczego musi on wyłączyć hibernację aplikacji.
-
Wywołaj interfejs API
createManageUnusedAppRestrictionsIntent()
, jak pokazano w przykładowym kodzie interfejsu API. Ten interfejs API tworzy zamiar, który wczytuje ekran Informacje o aplikacji w Ustawieniach. Użytkownik może wyłączyć hibernację aplikacji.Podczas wysyłania tej intencji musisz wywołać funkcję
startActivityForResult()
, a niestartActivity()
.Jak widać w tabeli 2, lokalizacja i nazwa opcji zależą od cech urządzenia, na którym zainstalowana jest aplikacja:
Tabela 2. Opcja wyłączająca hibernację aplikacji Cechy urządzenia Strona, na której pojawia się opcja Nazwa opcji do wyłączenia ma zainstalowanego Androida w wersji 13 lub nowszej, Informacje o aplikacji Wstrzymaj aktywność w aplikacji, jeśli jest nieużywana Urządzenie musi działać na Androidzie 12. Informacje o aplikacji Usuwanie uprawnień i zwalnienie miejsca działa na Androidzie 11, Informacje o aplikacji > Uprawnienia Usuń uprawnienia, jeśli aplikacja jest nieużywana ma zainstalowanego Androida w wersji 6.0–10, obsługiwanego przez usługi Google Play, Aplikacja Sklep Play > Menu > Play Protect > Uprawnienia dla nieużywanych aplikacji Usuń uprawnienia, jeśli aplikacja jest nieużywana
Przykład kodu interfejsu API
Ten przykład kodu pokazuje, jak sprawdzić, czy hibernacja jest włączona w aplikacji, oraz jak poprosić użytkowników o wyłączenie hibernacji w aplikacji.
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) }
Starsze interfejsy API platform
System operacyjny zawiera też 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 zostały przeniesione do starszych wersji Androida. Dlatego nie zalecamy używania interfejsu API.
Jeśli musisz tymczasowo korzystać z interfejsu API ze względu na zgodność, zapoznaj się z poniższą listą:
- Aby sprawdzić, czy hibernacja jest wyłączona w przypadku Twojej aplikacji:
isAutoRevokeWhitelisted()
- Aby przekierować użytkownika na stronę ustawień hibernacji: utwórz zamiar za pomocą
ACTION_APPLICATION_DETAILS_SETTINGS
.
Ręczne wywoływanie hibernacji
Aby sprawdzić, jak aplikacja zachowuje się po przejściu w stan hibernacji:
(dotyczy tylko Androida 12 lub nowszego) 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 tryb hibernacji. Dzięki temu możesz go przywrócić po przetestowaniu:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Skrócenie czasu oczekiwania przez system. W tym przykładzie system jest modyfikowany w taki sposób, że aplikacja przechodzi w stan hibernacji tylko 1 sekundę po tym, jak przestaniesz z nią wchodzić w interakcję:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Poczekaj na zakończenie transmisji podczas rozruchu 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ęczne wywołanie procesu hibernacji aplikacji:
adb shell cmd jobscheduler run -u 0 -f \ com.google.android.permissioncontroller 2
(dotyczy tylko Androida 12 lub nowszego) Sprawdź, czy aplikacja jest w stanie hibernacji, korzystając z jednej z tych metod:
- Uwaga: na urządzeniu testowym wyświetli się powiadomienie, które wskazuje, ż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