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 pod kątem dostępnego miejsca, a nie wydajności, a system chroni dane użytkownika. 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:
Wersja docelowego pakietu SDK | Cechy urządzenia | Skutki hibernacji |
---|---|---|
Android 12 lub nowszy. | ma zainstalowanego Androida 12 lub nowszego, |
Środowisko wykonawcze aplikacji uprawnienia 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 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 | ma zainstalowanego Androida 11, | Uprawnienia czasu działania aplikacji są resetowane. |
Android 11 | ma Androida w wersji od 6.0 (poziom interfejsu API 23) do Androida 10 (poziom interfejsu API 29) włącznie, i jest wspierane przez Google Usługi Google Play |
Uprawnienia czasu działania aplikacji zostały zresetowane. Ta zmiana zacznie obowiązywać w grudniu 2021 r. Więcej informacji znajdziesz w tym blogu opublikuj na temat tworzenie automatyczne resetowanie uprawnień na miliardach innych urządzeń. |
Zachowanie systemu, gdy aplikacja wychodzi z hibernacji
Gdy użytkownik wejdzie w interakcję z aplikacją, przestaje ona być w stanie hibernacji, mogą ponownie tworzyć oferty pracy, 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.
Przełóż zlecenia, alerty i powiadomienia zaplanowane wcześniej Aplikacja przeszła 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óre są wywoływane, gdy aplikacja wychodzi z stanu hibernacji i 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 aktywność w aplikacji jest 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 funkcje są też: które są uznawane za interakcje użytkownika:
- Użytkownik wchodzi w interakcję z widżetem.
Użytkownik wchodzi w interakcję z powiadomieniem, z wyjątkiem zamknięcia powiadomienie.
Należy pamiętać, że korzystanie z aplikacji w trybie hibernacji nie wymaga wyraźnej interakcji użytkownika. Dopóki komponent pakietu będzie wywoływany, nadal będzie uwzględnia wykorzystanie 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. Mogą to być na przykład edytory metod wprowadzania (IME) lub menedżery haseł.
Odbiorniki transmisji w pakiecie odbierające transmisję z pakietu zewnętrznego.
Elementy inne niż przykłady
Jeśli w aplikacji występują tylko zdarzenia opisane na poniższej liście, aplikacja przechodzi w stan hibernacji po kilku miesiącach:
- Uruchamia zaplanowane zadanie za pomocą
JobScheduler
. - Otrzymuje niejawną transmisję.
- Planuje alarmy.
Wykluczenia systemu z 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, zostanie zwolniona od standardów użytkowania aplikacjii nie przechodzi w stan hibernacji.
- Aplikacje nie wyświetlają się w Menu z aplikacjami
- Każda aplikacja, która nie ma aktywnego kafelka skrótów w programie uruchamiającym.
- 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ę również w profilu osobistym, tylko profil służbowy aplikacja profilu jest wykluczona.
- 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 uprawnieniami operatora
- Każda aplikacja, którą operatorzy komórkowi wczytują na urządzeniach wstępnie i uznają za niezbędną zobowiązań umownych dotyczących usług, np. aplikacji do poczty głosowej lub obsługi klienta;
- Aplikacje instalujące innych firm
- Sklepy z aplikacjami innych firm w celu automatycznego aktualizowania zainstalowanych aplikacji w razie potrzeby.
Wyjątki dotyczące użytkowników z hibernacji
Jeśli przewidujesz, że tryb hibernacji będzie miał 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 użytkownikiem, na przykład gdy aplikacja wykonuje jedną z tych czynności:
- zapewnić bezpieczeństwo rodzinie, okresowo przekazując lokalizację członków rodziny;
- 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 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ł już hibernację Twojej aplikacji, użyj interfejsu API getUnusedAppRestrictionsStatus()
.
Więcej informacji o korzystaniu z tego interfejsu API w aplikacji znajdziesz w tym artykule: przykładowy kod na tej stronie.
Poproś użytkownika o wyłączenie hibernacji w Twojej aplikacji
Jeśli użytkownik nie wyłączył jeszcze hibernacji dla Twojej aplikacji, możesz wysłać do niego prośbę. W tym celu wykonaj następujące czynności:
- wyświetlać interfejs użytkownika wyjaśniający, dlaczego musi wyłączyć usługę; do hibernacji aplikacji.
-
Wywołaj interfejs API
createManageUnusedAppRestrictionsIntent()
, jak pokazano w przykładowym kodzie interfejsu API. Ten interfejs API tworzy intencję, która wczytuje w Ustawieniach ekran Informacje o aplikacji. Użytkownik może wyłączyć hibernację aplikacji.Podczas wysyłania tej intencji musisz wywołać funkcję
startActivityForResult()
, a niestartActivity()
.Jak pokazano 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ę opcja Nazwa opcji, którą chcesz wyłączyć mieć 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 ma zainstalowanego Androida 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 jest w technologii Google Play usługi Aplikacja Sklep Play > Menu > Play Protect > Uprawnienia dla nieużywanych aplikacji Odbieranie uprawnień, jeśli aplikacja nie jest używana
Przykład kodu 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.
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 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 funkcji hibernacji, które zostały przeniesione do starszych wersji Androida. Dlatego nie zalecamy używania interfejsu API.
Jeśli chcesz tymczasowo nadal używać interfejsu API w celu zapewnienia zgodności, Jak z niego korzystać:
- 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:
(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 stan hibernacji. Dzięki temu możesz go przywrócić po zakończeniu testowania:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Skrócenie czasu oczekiwania przez system. W poniższym przykładzie system jest zmodyfikowany tak, że aplikacja przechodzi w stan hibernacji tylko na sekundę. po zakończeniu interakcji z aplikacją:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Uruchom to polecenie, by zaczekać na zakończenie wszelkich transmisji na urządzeniu testowym. następujące 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 i nowszych) Sprawdź, czy aplikacja jest w stanie hibernacji, korzystając z jednej z tych metod:
- Zwróć uwagę, że urządzenie testowe wyświetla teraz powiadomienie informujące, że: nieużywane aplikacje są zahibernowane.
Uruchom to polecenie:
adb shell cmd app_hibernation get-state
PACKAGE-NAME
Przywróć domyślny czas oczekiwania systemu przełączenie aplikacji w tryb hibernacji.
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold