Hibernacja aplikacji

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 miejsce na dane zamiast wydajności, a także chroni dane użytkowników. 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:

Tabela 1. Skutki hibernacji na Twoją aplikację
Docelowa wersja pakietu SDK Cechy urządzenia Skutki hibernacji
Android 12 lub nowszy. mieć zainstalowanego Androida 12 lub nowszego,

Uprawnienia w czasie wykonywania aplikacji są resetowane. 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 w pamięci podręcznej aplikacji zostaną usunięte.

Android 11 działa na Androidzie 11, Uprawnienia czasu działania aplikacji zostaną zresetowane.
Android 11 musi działać na Androidzie w wersji od 6.0 (poziom interfejsu API 23) do 10 (poziom interfejsu API 29) włącznie i wykorzystywać Usługi 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 blogu na temat automatycznego resetowania uprawnień dostępnych dla miliardów dodatkowych urządzeń.

Sposób działania systemu, gdy aplikacja wychodzi z hibernacji

Gdy użytkownik ponownie wejdzie w interakcję z aplikacją, aplikacja wyjdzie z stanu hibernacji i znów będzie mogła tworzyć zadania, alerty i powiadomienia.

System nie wykonuje jednak tych czynności:

  1. ponownie przyznać uprawnienia aplikacji na czas jej działania.

    Użytkownik musi ponownie przyznać te uprawnienia Twojej aplikacji.

  2. Zmień harmonogram zadań, alertów i powiadomień, które zostały zaplanowane przed przejściem aplikacji 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óra jest wywoływana, gdy aplikacja wychodzi z stanu hibernacji 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 zastosowania aplikacji

Gdy działalność w aplikacji zostanie wznowiona, 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 działania są też uznawane za interakcje z użytkownikiem:

  • Użytkownik wchodzi w interakcję z widżetem.
  • Użytkownik wchodzi w interakcję z powiadomieniem, z wyjątkiem jego zamknięcia. Powiadomienie

Pamiętaj, że korzystanie z aplikacji w trybie hibernacji nie wymaga wyraźnej interakcji użytkownika. Dopóki wywoływany jest jakiś element pakietu, jest to nadal uznawane za korzystanie z 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. Na przykład edytory metody wprowadzania (IME) lub menedżery haseł.
  • Odbiorniki transmisji w pakiecie odbierające transmisję z pakietu zewnętrznego.

Przykłady niespełniające kryteriów

Jeśli aplikacja wykazuje tylko zachowania opisane na tej liście, po kilku miesiącach przechodzi w stan hibernacji:

Wyjątki od 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, jest zwolniona z standardów użytkowania aplikacji i nie będzie przechodzić w stan uśpienia.

Aplikacje nie wyświetlają się w Menu z aplikacjami
Każda aplikacja, która nie ma aktywnej ikony skrótu w menu.
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ę też na profilu osobistym, wyjątek dotyczy tylko aplikacji na profilu służbowym.
Kontrolery zasad dotyczących urządzeń
Aplikacje, które kontrolują zasady urządzeń lokalnych i aplikacje systemowe na urządzeniach.
Aplikacje z uprawnieniami operatora
Wszelkie aplikacje wstępnie zainstalowane przez operatorów telefonii komórkowych na urządzeniach i uznane za niezbędne do spełnienia zobowiązań wynikających z umowy, np. aplikacje poczty głosowej lub obsługi klienta.
Aplikacje instalujące innych firm
Sklepy innych firm z aplikacjami, które w razie potrzeby automatycznie aktualizują zainstalowane aplikacje.

Wyjątki dotyczące użytkowników z hibernacji

Jeśli przewidujesz, że tryb hibernacji może mieć wpływ na główny przypadek użycia aplikacji, możesz poprosić użytkownika o wyłączenie hibernacji aplikacji. Ta wyjątek jest przydatny w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet bez interakcji z aplikacją, na przykład gdy:

  • zapewnić bezpieczeństwo rodzinie, okresowo przekazując informacje o lokalizacji członków grupy rodzinnej.
  • 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 wyjątek, wykonaj czynności opisane w następnych sekcjach.

Sprawdź, czy użytkownik nie wyłączył już hibernacji dla Twojej 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 przykładzie kodu API na tej stronie.

Prośba o wyłączenie hibernacji aplikacji

Jeśli użytkownik nie wyłączył jeszcze hibernacji dla Twojej aplikacji, możesz wysłać do niego prośbę. Aby to zrobić, wykonaj te czynności:

  1. Wyświetl interfejs użytkownika, który wyjaśnia, dlaczego musi on wyłączyć hibernację aplikacji.
  2. Wywołaj interfejs API createManageUnusedAppRestrictionsIntent(), jak pokazano w przykładowym kodzie interfejsu API. Ten interfejs API tworzy zamiar, który wczytuje ekran Informacje o aplikacji w Ustawieniach. Użytkownik może wyłączyć hibernację aplikacji.

    Podczas wysyłania tej intencji musisz wywołać funkcję startActivityForResult(), a nie startActivity().

    Jak widać w tabeli 2, lokalizacja i nazwa opcji zależą od właściwości urządzenia, na którym zainstalowana jest aplikacja:

    Tabela 2. Opcja wyłączająca hibernację aplikacji
    Cechy urządzenia Strona, na której pojawia się opcja Nazwa opcji do wyłączenia
    mieć zainstalowanego Androida 13 lub nowszego, Informacje o aplikacji Wstrzymaj aktywność w aplikacji, jeśli jest nieużywana
    Urządzenie działa na Androidzie 12. Informacje o aplikacji Usuwanie uprawnień i zwalnienie miejsca
    działa na Androidzie 11, Informacje o aplikacji > Uprawnienia Usuń uprawnienia, jeśli aplikacja jest nieużywana
    ma zainstalowanego Androida w wersji 6.0–10, obsługiwanego przez usługi Google Play, Aplikacja Sklep Play > Menu > Play Protect > Uprawnienia dla 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 aplikacji, oraz jak poprosić 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)
}

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 musisz tymczasowo korzystać z interfejsu API ze względu na zgodność, zapoznaj się z tą listą:

Ręczne wywoływanie hibernacji

Aby sprawdzić, jak aplikacja zachowuje się po przejściu w stan hibernacji:

  1. (dotyczy tylko Androida 12 lub nowszego) Włącz hibernację na urządzeniu:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Ustaw domyślny czas oczekiwania systemu na przejście w tryb hibernacji. Dzięki temu możesz przywrócić go po przetestowaniu:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Skrócenie czasu oczekiwania systemu. W tym przykładzie system jest modyfikowany w taki sposób, że aplikacja przechodzi w stan hibernacji tylko 1 sekundę po tym, jak przestaniesz z nią wchodzić w interakcję:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Poczekaj na zakończenie transmisji podczas rozruchu 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!

  5. Ręczne wywołanie procesu hibernacji aplikacji:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Dotyczy tylko Androida 12 i nowszych) Sprawdź, czy aplikacja jest w stanie hibernacji, korzystając z jednej z tych metod:

    • Na urządzeniu testowym wyświetli się powiadomienie, które informuje, że nieużywane aplikacje są w stanie hibernacji.
    • Uruchom to polecenie:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Przywróć domyślny czas oczekiwania systemu przed przeniesieniem aplikacji w stan hibernacji:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold