Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, a użytkownik nie korzysta z niej przez kilka miesięcy, system przełączy ją w stan hibernacji. System optymalizuje skuteczność pod kątem dostępnego miejsca, a nie wydajności, a także chroni dane użytkowników. Przypomina to zachowanie systemu, 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, a także od urządzenia, na którym aplikacja jest uruchomiona:
Docelowa wersja pakietu SDK | Charakterystyka urządzenia | Efekty hibernacji |
---|---|---|
Androida 12 lub nowszego, | ma zainstalowanego Androida 12 lub nowszego, |
Uprawnienia środowiska wykonawczego aplikacji zostaną zresetowane. To działanie daje taki sam efekt 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, które są wysyłane przez Komunikację w chmurze Firebase. Wszystkie pliki z pamięci podręcznej aplikacji zostaną usunięte. |
Android 11 | ma Androida 11. | Uprawnienia czasu działania aplikacji są resetowane. |
Android 11 | Obsługuje Androida od 6.0 (poziom interfejsu API 23) do 10 (poziom interfejsu API 29) włącznie i korzysta z Usług 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 temat udostępniania automatycznego resetowania uprawnień miliardom kolejnych urządzeń. |
Zachowanie systemu, gdy aplikacja przechodzi ze stanu hibernacji
Gdy użytkownik wejdzie w interakcję z aplikacją, zakończy hibernację i może ponownie utworzyć zadania, alerty i powiadomienia.
W przypadku aplikacji system nie wykona jednak tych czynności:
Ponownie przyznaj uprawnienia czasu działania aplikacji.
Użytkownik musi ponownie przyznać te uprawnienia aplikacji.
przełożyć zadania, alerty i powiadomienia, które zostały zaplanowane, zanim aplikacja przejdzie w stan hibernacji;
Aby ułatwić sobie obsługę tego przepływu pracy, użyj usługi WorkManager. Możesz też dodać funkcję zmiany harmonogramu w odbiorniku transmisji
ACTION_BOOT_COMPLETED
, która jest wywoływana, gdy aplikacja przejdzie w stan hibernacji i po uruchomieniu urządzenia.
Transmisja danych w aplikacjach
W kolejnych sekcjach znajdziesz przykłady użycia aplikacji oraz działania, których system nie uznaje za takie korzystanie.
Przykłady użycia aplikacji
Po wznowieniu działania w aplikacji system uzna to zdarzenie za interakcję użytkownika. W związku z tym system wydłuża okres hibernacji aplikacji.
W Androidzie 11 i nowszych za interakcje użytkowników uznaje się też takie zachowania:
- Użytkownik wchodzi w interakcję z widżetem.
Użytkownik wchodzi w interakcję z powiadomieniem, z wyjątkiem odrzucania powiadomienia.
Pamiętaj, że używanie aplikacji do hibernacji nie wymaga bezpośrednio interakcji z użytkownikiem. Dopóki komponent pakietu jest wywoływany, uznaje się go za użycie 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. Dotyczy to na przykład edytorów metody wprowadzania (IME) lub menedżerów haseł.
Odbiorniki w pakiecie otrzymują wyraźną transmisję z pakietu zewnętrznego.
Inne niż przykłady
Jeśli aplikacja wykazuje zachowania tylko opisane na tej liście, po kilku miesiącach przejdzie w stan hibernacji:
- Uruchamia zaplanowane zadanie za pomocą metody
JobScheduler
. - Odbiera niejawną transmisję.
- Planowanie alarmów.
Wykluczenia systemu z powodu hibernacji
W określonych przypadkach Android pozwala na wyjątki od hibernacji aplikacji na poziomie systemu. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona ze standardów użytkowania i nie podlega hibernacji.
- Aplikacje niewyświetlane w Menu z aplikacjami
- Wszystkie aplikacje, które nie mają aktywnego kafelka skrótu w Menu z aplikacjami.
- Aplikacje 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, wykluczona jest tylko aplikacja profilu służbowego.
- Kontrolery zasad dotyczących urządzeń
- Aplikacje kontrolujące lokalne zasady dotyczące urządzeń i aplikacje systemowe na urządzeniach.
- Aplikacje uprzywilejowane przez operatora
- Wszelkie aplikacje, które operatorzy komórkowi wstępnie pobierają na urządzenia i uważają za niezbędne w związku z umowami o świadczenie usług (np. aplikacje poczty głosowej lub aplikacje do obsługi klienta).
- Aplikacje instalacyjne innych firm
- Sklepy z aplikacjami innych firm, aby w razie potrzeby automatycznie aktualizować zainstalowane aplikacje.
Wykluczenie użytkowników z trybu hibernacji
Jeśli uważasz, że hibernacja wpływa na główny przypadek użycia aplikacji, możesz poprosić użytkownika o zwolnienie z tego trybu. To wykluczenie przydaje się wtedy, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet wtedy, gdy nie wchodzi on w interakcję z aplikacją, np. gdy:
- Zadbaj o bezpieczeństwo rodziny, okresowo zgłaszając lokalizację jej członków.
- Synchronizuj dane między urządzeniem a serwerem aplikacji.
- komunikować się z urządzeniami takimi jak telewizor;
- Sparuj z urządzeniami towarzyszącymi, np. z zegarkiem.
Aby poprosić o zwolnienie, wykonaj czynności opisane w poniższych sekcjach.
Sprawdź, czy użytkownik wyłączył już hibernację w Twojej aplikacji
Aby sprawdzić, czy użytkownik wyłączył hibernację w Twojej aplikacji, użyj interfejsu API getUnusedAppRestrictionsStatus()
.
Więcej informacji o używaniu tego interfejsu API w aplikacji znajdziesz w przykładowym kodzie interfejsu 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ć mu prośbę. Aby to zrobić:
- Wyświetlaj interfejs z wyjaśnieniem, dlaczego musi wyłączyć hibernację w aplikacji.
-
Wywołaj interfejs API
createManageUnusedAppRestrictionsIntent()
w sposób pokazany w przykładowym kodzie API. Ten interfejs API tworzy intencję, która wczytuje ekran Informacje o aplikacji w Ustawieniach. W tym miejscu użytkownik może wyłączyć hibernację w aplikacji.Ważne jest, by podczas wysyłania tej intencji wywołać metodę
startActivityForResult()
, a niestartActivity()
.Jak pokazano w tabeli 2, lokalizacja i nazwa opcji zależą od parametrów urządzenia, na którym jest zainstalowana Twoja aplikacja:
Tabela 2. Opcja, która wyłącza hibernację aplikacji Charakterystyka urządzenia Strona, na której pojawia się opcja Nazwa opcji, którą chcesz wyłączyć ma system Android 13 lub nowszy, Informacje o aplikacji Wstrzymywanie nieużywanej aktywności w aplikacji ma Androida 12, Informacje o aplikacji Odbieranie uprawnień i zwalnianie miejsca ma Androida 11. Informacje o aplikacji > Uprawnienia Usuwanie uprawnień, gdy aplikacja nie jest używana ma Androida w wersji od 6.0 do 10 włącznie oraz korzysta z Usług Google Play. Aplikacja Play > Menu > Play Protect > Uprawnienia dla nieużywanych aplikacji Usuwanie uprawnień, gdy aplikacja nie jest używana
Przykładowy kod interfejsu API
Ten przykładowy kod pokazuje, jak sprawdzić, czy hibernacja jest włączona w przypadku Twojej aplikacji, i w jaki 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) }
Starsza wersja interfejsu API platformy
System operacyjny zawiera też interfejs API do interakcji z funkcją hibernacji. Działa on jednak tylko na urządzeniach z Androidem 11 lub nowszym. Nie obsługuje funkcji hibernacji, które zostały przeniesione do wcześniejszych wersji Androida. Dlatego nie zalecamy korzystania z niego.
Jeśli chcesz tymczasowo nadal używać interfejsu API, aby zachować zgodność, skorzystaj z tej listy:
- Aby sprawdzić, czy hibernacja jest wyłączona w przypadku Twojej aplikacji:
isAutoRevokeWhitelisted()
- Aby przekierować użytkownika na stronę ustawień hibernacji: utwórz intencję, używając
ACTION_APPLICATION_DETAILS_SETTINGS
.
Ręczne wywoływanie działania hibernacji
Aby przetestować zachowanie aplikacji po tym, jak system umieści ją w stanie hibernacji, wykonaj te czynności:
(Tylko Android 12 i nowsze) Włącz funkcję hibernacji na urządzeniu:
adb shell device_config put app_hibernation app_hibernation_enabled true
Ustaw domyślny czas, przez jaki system czeka na przejście do hibernacji. W ten sposób możesz przywrócić konto po przetestowaniu:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Skrócenie czasu oczekiwania systemu. W poniższym przykładzie system jest zmodyfikowany w taki sposób, że aplikacja przechodzi w stan hibernacji tylko 1 sekundę po tym, jak przestaniesz z niej korzystać:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Poczekaj na zakończenie wszystkich komunikatów wyświetlanych podczas uruchamiania 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) Upewnij się, że aplikacja jest hibernowana, korzystając z jednej z tych metod:
- Zwróć uwagę, że urządzenie testowe wyświetla teraz powiadomienie informujące, że nieużywane aplikacje są hibernowane.
Uruchom to polecenie:
adb shell cmd app_hibernation get-state PACKAGE-NAME
Przywróć domyślny czas, przez jaki system czeka, zanim aplikacja przejdzie w stan hibernacji:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold