Jeśli Twoja aplikacja jest kierowana na Androida 11 (API na poziomie 30) lub nowszego, a użytkownik nie wchodzi z nią w interakcję przez kilka miesięcy, system przełącza ją w stan hibernacji. System optymalizuje miejsce na dane, a nie wydajność, i chroni dane użytkownika. To zachowanie systemu jest podobne do tego, co dzieje się, gdy użytkownik ręcznie wymusi zatrzymanie aplikacji w ustawieniach systemu.
Skutki hibernacji
Jak widać w tabeli 1, skutki hibernacji zależą od docelowej wersji pakietu SDK aplikacji oraz urządzenia, na którym aplikacja jest uruchomiona:
| Wersja docelowa pakietu SDK | Cechy urządzenia | Skutki hibernacji |
|---|---|---|
| Android 12 lub nowszy, | ma Androida 12 lub nowszego, |
Uprawnienia w czasie działania aplikacji zostaną zresetowane. To działanie ma taki sam skutek, jak gdyby użytkownik wyświetlił uprawnienie w ustawieniach systemowych i zmienił poziom dostępu aplikacji na Odmów. Aplikacja nie może uruchamiać zadań ani 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. Pliki w pamięci podręcznej aplikacji zostaną usunięte. |
| Android 11 | Android 11 | Uprawnienia aplikacji w czasie działania zostaną zresetowane. |
| Android 11 | ma Androida w wersji od 6.0 (poziom interfejsu API 23) do 10 (poziom interfejsu API 29) i korzysta z Usług Google Play; |
Uprawnienia aplikacji w czasie działania zostaną zresetowane. Ta zmiana wejdzie w życie w grudniu 2021 r. Więcej informacji znajdziesz w tym poście na blogu o udostępnianiu automatycznego resetowania uprawnień na miliardach kolejnych urządzeń. |
Zachowanie systemu, gdy aplikacja wychodzi ze stanu hibernacji
Gdy użytkownik ponownie wejdzie w interakcję z aplikacją, wyjdzie ona ze stanu hibernacji i będzie mogła ponownie tworzyć zadania, alerty i powiadomienia.
System nie wykonuje jednak tych czynności w przypadku Twojej aplikacji:
Ponownie przyznaj uprawnienia w czasie działania aplikacji.
Użytkownik musi ponownie przyznać te uprawnienia aplikacji.
Ponownie zaplanuj wszystkie zadania, alerty i powiadomienia, które zostały zaplanowane przed przejściem aplikacji w stan hibernacji.
Aby łatwiej obsługiwać ten przepływ pracy, użyj WorkManagera. Możesz też dodać logikę ponownego planowania w odbiorniku komunikatów
ACTION_BOOT_COMPLETED, który jest wywoływany, gdy aplikacja wychodzi ze stanu hibernacji i po uruchomieniu urządzenia.
Transmisja danych w aplikacjach
W sekcjach poniżej znajdziesz przykłady korzystania z aplikacji, a także przykłady działań, których system nie uznaje za korzystanie z aplikacji.
Przykłady korzystania z aplikacji
Gdy aktywność w aplikacji zostanie wznowiona, system uzna to zdarzenie za interakcję użytkownika. Dlatego system wydłuża czas, zanim aplikacja przejdzie w stan hibernacji.
Na Androidzie 11 i nowszych za interakcje użytkownika uznawane są też te działania:
- Użytkownik wchodzi w interakcję z widżetem.
Użytkownik wchodzi w interakcję z powiadomieniem, ale nie odrzuca powiadomienia.
Należy pamiętać, że korzystanie z aplikacji w celu hibernacji nie wymaga wyraźnej interakcji użytkownika. Dopóki wywoływany jest komponent pakietu, jest to nadal uznawane za korzystanie z aplikacji. Przykłady:
- aplikacje, które mają usługę lub mechanizm dostarczania treści powiązane z inną aplikacją na urządzeniu lub z systemem operacyjnym; Na przykład edytory metod wprowadzania (IME) lub menedżery haseł.
Odbiorniki transmisji w pakiecie odbierające bezpośrednią transmisję z pakietu zewnętrznego.
Przykłady nieprawidłowe
Jeśli Twoja aplikacja wykazuje tylko zachowania opisane na poniższej liście, po kilku miesiącach zostanie przełączona w tryb hibernacji:
- Uruchamia zaplanowane zadanie za pomocą
JobScheduler. - odbiera komunikat ogólny (broadcast);
- Planuje alarmy.
Wyjątki systemowe od hibernacji
W niektórych przypadkach Android przyznaje zwolnienia z hibernacji aplikacji na poziomie systemu. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona ze standardów korzystania z aplikacji i nie zostanie przełączona w tryb hibernacji.
- Aplikacje nie są wyświetlane w Menu z aplikacjami
- Każda aplikacja, która nie ma aktywnego kafelka skrótu w menu z aplikacjami.
- Aplikacje w profilu służbowym
- Każda aplikacja, którą użytkownik instaluje w profilu służbowym. Pamiętaj, że jeśli ta sama aplikacja znajduje się też na profilu osobistym, zwolnienie dotyczy tylko aplikacji na profilu służbowym.
- Kontrolery zasad dotyczących urządzeń
- Aplikacje, które kontrolują lokalne zasady dotyczące urządzeń i aplikacje systemowe na urządzeniach.
- Aplikacje z uprawnieniami operatora
- Aplikacje, które operatorzy sieci komórkowych wstępnie instalują na urządzeniach i uznają za niezbędne do wypełnienia zobowiązań wynikających z umowy, np. aplikacje do obsługi poczty głosowej lub obsługi klienta.
- Aplikacje instalacyjne innych firm
- Sklepy innych firm z aplikacjami, aby w razie potrzeby automatycznie aktualizować zainstalowane aplikacje.
Wyłączenie użytkowników z hibernacji
Jeśli przewidujesz, że hibernacja może mieć wpływ na podstawowy przypadek użycia aplikacji, możesz poprosić użytkownika o wyłączenie hibernacji. To zwolnienie jest przydatne w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet bez interakcji z użytkownikiem, np. gdy aplikacja:
- Zapewnianie bezpieczeństwa rodzinie przez okresowe raportowanie lokalizacji członków grupy rodzinnej.
- synchronizować dane między urządzeniem a serwerem aplikacji;
- komunikować się z inteligentnymi urządzeniami, takimi jak telewizor;
- parować z urządzeniami towarzyszącymi, takimi jak zegarek;
Aby poprosić o wyjątek, wykonaj czynności opisane w poniższych sekcjach.
Sprawdzanie, czy użytkownik wyłączył już hibernację aplikacji
Aby sprawdzić, czy użytkownik wyłączył już hibernację aplikacji, użyj interfejsu API getUnusedAppRestrictionsStatus().
Więcej informacji o tym, jak używać tego interfejsu API w aplikacji, znajdziesz w przykładzie kodu interfejsu API na tej stronie.
Poproś użytkownika o wyłączenie hibernacji aplikacji.
Jeśli użytkownik nie wyłączył jeszcze hibernacji aplikacji, możesz wysłać mu prośbę. Aby to zrobić, wykonaj te czynności:
- Wyświetl interfejs, który wyjaśnia użytkownikowi, dlaczego musi wyłączyć hibernację aplikacji.
-
Wywołaj interfejs API
createManageUnusedAppRestrictionsIntent(), jak pokazano w przykładowym kodzie interfejsu API. Ten interfejs API tworzy intencję, która wczytuje ekran Informacje o aplikacji w Ustawieniach. Z tego miejsca użytkownik może wyłączyć hibernację aplikacji.Podczas wysyłania tej intencji ważne jest, aby wywołać
startActivityForResult(), a niestartActivity().Jak pokazano w tabeli 2, lokalizacja i nazwa opcji zależą od cech urządzenia, na którym jest zainstalowana aplikacja:
Tabela 2. Opcja wyłączająca hibernację aplikacji Cechy urządzenia Strona, na której pojawia się opcja Nazwa opcji, którą chcesz wyłączyć ma Androida 13 lub nowszego, Informacje o aplikacji Wstrzymaj aktywność w aplikacji, jeśli jest nieużywana Android 12 Informacje o aplikacji Usuń uprawnienia i zwolnij miejsce Android 11 Informacje o aplikacji > Uprawnienia Usuń uprawnienia, jeśli aplikacja jest nieużywana ma system Android w wersji od 6.0 do 10 i korzysta z Usług Google Play; Aplikacja Google Play > Menu > Play Protect > Uprawnienia nieużywanych aplikacji Usuń uprawnienia, jeśli aplikacja jest nieużywana
Przykładowy kod interfejsu API
Ten przykładowy kod pokazuje, jak sprawdzić, czy hibernacja jest włączona w aplikacji, oraz jak prawidłowo 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) }
Starszy interfejs API platformy
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 on funkcji hibernacji, które zostały przeniesione do wcześniejszych wersji Androida. Dlatego nie zalecamy korzystania z interfejsu API.
Jeśli ze względu na zgodność musisz tymczasowo nadal używać interfejsu API, na tej liście znajdziesz informacje o tym, jak to zrobić:
- Aby sprawdzić, czy hibernacja jest wyłączona w przypadku Twojej aplikacji:
isAutoRevokeWhitelisted() - Aby przekierować użytkownika na stronę ustawień hibernacji, utwórz intencję za pomocą
ACTION_APPLICATION_DETAILS_SETTINGS.
Ręczne wywoływanie hibernacji
Aby sprawdzić, jak aplikacja zachowuje się po przejściu w stan hibernacji, wykonaj te czynności:
(Tylko Android 12 i nowsze wersje) Włącz zachowanie hibernacji na urządzeniu:
adb shell device_config put app_hibernation app_hibernation_enabled true
Ustaw domyślny czas oczekiwania systemu przed przejściem w stan hibernacji. Dzięki temu po zakończeniu testów będzie można ją przywrócić:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Skróć czas oczekiwania systemu. W tym przykładzie system został zmodyfikowany tak, aby aplikacja przechodziła w stan hibernacji już po sekundzie od zakończenia interakcji z nią:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Poczekaj, aż na urządzeniu testowym zakończą się wszystkie transmisje podczas uruchamiania, 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 w stanie hibernacji, korzystając z jednej z tych metod:
- Zauważ, że na urządzeniu testowym wyświetla się teraz powiadomienie o tym, ż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 przełączeniem aplikacji w tryb hibernacji:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold