Jeśli Twoja aplikacja jest kierowana na Androida 11 (API na poziomie 30) lub nowszego, a użytkownik nie korzysta z niej przez kilka miesięcy, system przełącza ją w stan hibernacji. System optymalizuje miejsce na dane zamiast wydajności i chroni dane użytkownika. Działanie systemu jest podobne do tego, co się dzieje, gdy użytkownik ręcznie wymusza zatrzymanie aplikacji w ustawieniach systemu.
Skutki hibernacji
Jak pokazano w tabeli 1, wpływ hibernacji zależy od docelowej wersji pakietu SDK aplikacji oraz od urządzenia, na którym jest ona uruchomiona:
Wersja docelowego pakietu SDK | Cechy urządzenia | Skutki hibernacji |
---|---|---|
Android 12 lub nowszy | ma zainstalowanego Androida 12 lub nowszego, |
Uprawnienia aplikacji przy uruchamianiu zostaną zresetowane. Działanie to ma taki sam efekt, jak gdyby użytkownik wyświetlił uprawnienia w ustawieniach systemu 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 za pomocą Komunikacji w chmurze Firebase. Wszystkie pliki z pamięci podręcznej aplikacji zostaną usunięte. |
Android 11 | Android 11 | Uprawnienia aplikacji przy uruchamianiu zostaną zresetowane. |
Android 11 | urządzenie musi mieć Androida w wersji od 6.0 (poziom interfejsu API 23) do 10 (poziom interfejsu API 29) włącznie i korzystać z Usług Google Play; |
Uprawnienia aplikacji przy uruchamianiu zostaną zresetowane. Ta zmiana zacznie obowiązywać w grudniu 2021 r. Więcej informacji znajdziesz w tym poście na blogu o udostępnianiu automatycznego resetowania uprawnień na miliardach urządzeń. |
Zachowanie systemu, gdy aplikacja przestaje być w stanie hibernacji
Gdy użytkownik ponownie wejdzie w interakcję z aplikacją, wyjdzie ona z trybu 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 aplikacji uprawnienia czasu działania.
Użytkownik musi ponownie przyznać aplikacji te uprawnienia.
Zaplanuj ponownie 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 transmisji
ACTION_BOOT_COMPLETED
, który jest wywoływany, gdy aplikacja przestaje być w stanie hibernacji i po uruchomieniu urządzenia.
Transmisja danych w aplikacjach
W sekcjach poniżej znajdziesz przykłady użycia aplikacji oraz działań, które nie są uznawane za użycie aplikacji.
Przykłady użycia aplikacji
Gdy aktywność w aplikacji zostanie wznowiona, system uzna to zdarzenie za interakcję użytkownika. Dlatego system wydłuża czas, po którym aplikacja przechodzi w stan hibernacji.
Na urządzeniach z Androidem 11 i nowszym za interakcje użytkownika uznaje się też te działania:
- Użytkownik wchodzi w interakcję z widżetem.
Użytkownik wchodzi w interakcję z powiadomieniem, ale nie zamyka go.
Warto zauważyć, że korzystanie z aplikacji w trybie hibernacji nie wymaga interakcji użytkownika. Dopóki wywoływany jest komponent pakietu, jest to nadal uważane za używanie aplikacji. Przykłady:
- Aplikacje, które mają usługę lub dostawcę treści powiązanych z inną aplikacją na urządzeniu lub z systemem operacyjnym. Na przykład edytory metody wprowadzania (IME) lub menedżery haseł.
Odbiorniki transmisji w pakiecie odbierające jawną transmisję z pakietu zewnętrznego.
Przykłady
Jeśli Twoja aplikacja wykazuje tylko zachowania opisane na poniższej liście, po kilku miesiącach przejdzie w stan hibernacji:
- Uruchamia zaplanowane zadanie za pomocą
JobScheduler
. - Odbiera niejawny komunikat.
- Planowanie alarmów
Wyjątki systemowe od hibernacji
Android przyznaje zwolnienia z hibernacji aplikacji na poziomie systemu w określonych przypadkach użycia. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona z wymagań dotyczących korzystania z aplikacji i nie będzie przechodzić w stan uśpienia.
- Aplikacje nie są wyświetlane w programie uruchamiającym
- Każda aplikacja, która nie ma aktywnego kafelka skrótu w menu z aplikacjami.
- Aplikacje profilu służbowego
- Każda aplikacja zainstalowana przez użytkownika w profilu służbowym. Pamiętaj, że jeśli ta sama aplikacja znajduje się również w profilu osobistym, zwolniona jest tylko aplikacja w 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 operatora z uprawnieniami
- Aplikacje, które operatorzy komórkowi wstępnie instalują na urządzeniach i uznają za niezbędne do wypełnienia zobowiązań umownych, np. aplikacje do poczty głosowej lub obsługi klienta.
- Aplikacje instalacyjne innych firm
- Sklepy innych firm z aplikacjami, które w razie potrzeby automatycznie aktualizują zainstalowane aplikacje.
Wyjątki dotyczące użytkowników w przypadku hibernacji
Jeśli przewidujesz, że hibernacja wpłynie na podstawowy przypadek użycia w aplikacji, możesz poprosić użytkownika o wyjątek od hibernacji. To zwolnienie jest przydatne w sytuacjach, w których użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet bez jego interakcji z nią, np. gdy aplikacja wykonuje jedną z tych czynności:
- Zapewniać bezpieczeństwo rodzinie, okresowo raportując lokalizację jej członków.
- Synchronizuj dane między urządzeniem a serwerem aplikacji.
- komunikować się z inteligentnymi urządzeniami, np. telewizorem;
- parować się z urządzeniami towarzyszącymi, takimi jak zegarek;
Aby poprosić o wyjątek, wykonaj czynności opisane w poniższych sekcjach.
Sprawdź, czy użytkownik wyłączył już hibernację aplikacji.
Aby sprawdzić, czy użytkownik wyłączył już hibernację w przypadku Twojej aplikacji, użyj interfejsu getUnusedAppRestrictionsStatus()
.
Więcej informacji o tym, jak używać tego interfejsu API w aplikacji, znajdziesz w przykładzie kodu interfejsu API na tej stronie.
Prośba użytkownika o wyłączenie hibernacji aplikacji
Jeśli użytkownik nie wyłączył jeszcze hibernacji aplikacji, możesz wysłać do niego prośbę. Aby to zrobić, wykonaj te czynności:
- Wyświetl interfejs, który wyjaśni użytkownikowi, dlaczego musi wyłączyć hibernację w przypadku Twojej aplikacji.
-
Wywołaj interfejs API
createManageUnusedAppRestrictionsIntent()
, jak pokazano w przykładzie kodu interfejsu API. Ten interfejs API tworzy intencję, która w Ustawieniach wczytuje ekran Informacje o aplikacji. Użytkownik może tu wyłączyć hibernację aplikacji.Ważne jest, aby podczas wysyłania tego zamiaru wywoływać funkcję
startActivityForResult()
, a niestartActivity()
.Jak pokazano w tabeli 2, lokalizacja i nazwa opcji zależą od charakterystyki urządzenia, na którym jest zainstalowana aplikacja:
Tabela 2. Opcja, która wyłącza hibernację aplikacji Cechy urządzenia Strona, na której pojawia się opcja Nazwa opcji do wyłączenia ma zainstalowanego 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 zainstalowanego Androida w wersji od 6.0 do 10 włącznie i korzysta z Usług Google Play, Aplikacja Play > Menu > Ochrona w Google Play > Uprawnienia 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 przypadku Twojej aplikacji, oraz jak prawidłowo poprosić użytkowników o wyłączenie hibernacji w przypadku Twojej 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) }
Starsza wersja interfejsu 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 wcześniejszych wersji Androida. Dlatego nie zalecamy korzystania z interfejsu API.
Jeśli musisz tymczasowo nadal używać interfejsu API ze względu na zgodność, na poniższej 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 stanu hibernacji
Aby sprawdzić, jak aplikacja zachowuje się po przejściu w stan hibernacji, wykonaj te czynności:
(Tylko Android 12 lub nowszy) Włącz na urządzeniu tryb hibernacji:
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 po zakończeniu testowania możesz przywrócić poprzednią wersję:
threshold=$(adb shell device_config get permissions \ auto_revoke_unused_threshold_millis2)
Skróć czas oczekiwania systemu. W tym przykładzie system jest zmodyfikowany tak, aby aplikacja przechodziła w stan hibernacji dopiero sekundę po tym, jak przestaniesz z niej korzystać:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 1000
Poczekaj, aż na urządzeniu testowym zakończą się wszystkie transmisje uruchamiane podczas rozruchu, uruchamiając to polecenie:
adb shell am wait-for-broadcast-idle
Po zakończeniu transmisji polecenie zwróci ten 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
(Tylko Android 12 i nowsze wersje) Sprawdź, czy aplikacja jest w stanie hibernacji, korzystając z jednej z tych metod:
- Na urządzeniu testowym pojawi się powiadomienie informujące o tym, że nieużywane aplikacje zostały przełączone w stan hibernacji.
Uruchom to polecenie:
adb shell cmd app_hibernation get-state PACKAGE-NAME
Przywróć domyślny czas oczekiwania systemu przed wprowadzeniem aplikacji w stan hibernacji:
adb shell device_config put permissions \ auto_revoke_unused_threshold_millis2 $threshold