Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, a użytkownik nie interakcji z aplikacją przez kilka miesięcy, system umieści ją aplikacja jest w stanie hibernacji. System optymalizuje pod kątem dostępnego miejsca, a nie wydajności, a system chroni dane użytkownika. To działanie systemu jest podobne na to, co się dzieje, gdy użytkownik ręcznie wymusi zatrzymanie aplikacji w ustawieniach systemu.
Skutki hibernacji
Jak pokazano w tabeli 1, efekty hibernacji zależą od docelowego pakietu SDK aplikacji oraz urządzenie, 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, |
Środowisko wykonawcze aplikacji uprawnienia zostaną zresetowane. To działanie ma taki sam skutek, jak gdyby użytkownik wyświetlił uprawnienia w ustawieniach systemu i zmienił poziom dostępu aplikacji na Deny (Odmów). Aplikacja nie może uruchamiać zadań ani alertów w tle. Aplikacja nie może otrzymywać powiadomień push, w tym powiadomień o wysokim priorytecie wysyłane przez Chmura Firebase Wiadomości. Wszystkie pliki w aplikacji pamięci podręcznej. |
Android 11 | Android 11 | Uprawnienia czasu działania aplikacji zostały zresetowane. |
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 wejdzie w życie 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 po wyjściu aplikacji ze stanu 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 wykona jednak tych czynności:
Ponownie przyznaj uprawnienia w czasie działania aplikacji.
Użytkownik musi ponownie przyznać te uprawnienia aplikacji.
Przełóż zlecenia, alerty i powiadomienia zaplanowane wcześniej Aplikacja przeszła w stan hibernacji.
Aby ułatwić sobie pracę, skorzystaj z WorkManager. Możesz też dodać o zmianie harmonogramu
ACTION_BOOT_COMPLETED
odbiornika, który jest wywoływany, gdy aplikacja opuści hibernację i po uruchomieniu urządzenia.
Transmisja danych w aplikacjach
W sekcjach poniżej znajdziesz przykłady użycia aplikacji oraz przykłady Działania, których system nie uznaje za używanie 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, po którym aplikacja przechodzi 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 okna powiadomienie.
Pamiętaj, że używanie aplikacji do hibernacji nie wymaga 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órych usługa lub dostawca treści jest powiązany z inną aplikacją na urządzeniu; lub system operacyjny. Mogą to być na przykład edytory metod wprowadzania (IME) lub menedżery haseł.
Odbiorniki transmisji w pakiecie odbierające wprost 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ę.
- Ustawia alarmy.
Wykluczenia systemu z hibernacji
W określonych przypadkach użycia Android umożliwia zwolnienie na poziomie systemu z hibernacji aplikacji. 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 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ę 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 podwyższonymi 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;
- Instalatory aplikacji innych firm
- Sklepy z aplikacjami innych firm w celu automatycznego aktualizowania zainstalowanych aplikacji w razie potrzeby.
Zwolnienia użytkowników z hibernacji
Jeśli spodziewasz się, że hibernacja wpływa na główny przypadek użycia Twojej aplikacji, możesz poprosić użytkownika o zwolnienie z hibernacji aplikacji. To zwolnienie przydaje się w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać nawet wtedy, gdy użytkownik nie wchodzi w interakcję z aplikacją, np. wykonuje dowolną z tych czynności:
- Zadbaj o bezpieczeństwo rodziny, okresowo zgłaszając jej lokalizację 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ł już hibernację w aplikacji:
skorzystaj z funkcji getUnusedAppRestrictionsStatus()
API.
Więcej informacji o korzystaniu z tego interfejsu API w aplikacji znajdziesz w artykule Interfejs API 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 w aplikacji, możesz wysłać do użytkownika. 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
createManageUnusedAppRestrictionsIntent()
API zgodnie z przykładowym kodem interfejsu 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.Pamiętaj, by zadzwonić pod numer
startActivityForResult()
, a niestartActivity()
podczas wysyłania tej intencji.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ę na urządzeniu 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 jest w technologii Google Play usługi Aplikacja Google Play > Menu > Play Protect > Nieużywane uprawnienia aplikacje, Odbieranie uprawnień, jeśli aplikacja nie jest używana
Przykład kodu API
Ten przykładowy kod pokazuje, jak sprawdzić, czy hibernacja jest włączona dla oraz poprawny sposób proszenia 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) }
Interfejs API starszej platformy
System operacyjny zawiera również interfejs API do hibernacji. funkcji. Interfejs API działa jednak tylko na urządzeniach z Androidem 11 lub nowszym. interfejs API nie obsługuje funkcji hibernacji, które są przeniesione do wcześniejszej wersji Wersje Androida. Dlatego nie zalecamy korzystania z niego.
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 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 przetestować zachowanie aplikacji po tym, jak system przejdzie w stan hibernacji , wykonaj te czynności:
(Tylko Android 12 i nowsze wersje) Włącz hibernację na urządzenie:
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 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ę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) Upewnij się, że aplikacja jest w stanie hibernacji, za pomocą poniższych 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