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. ma 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 z pamięci podręcznej aplikacji zostaną usunięte.

Android 11 działa na Androidzie 11, Uprawnienia czasu działania aplikacji są resetowane.
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ń.

Zachowanie 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 użycia 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 użytkowników:

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

Należy pamiętać, że korzystanie z aplikacji w trybie hibernacji nie wymaga wyraźnej interakcji użytkownika. Dopóki wywoływany jest jakiś element pakietu, nadal jest to 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 korzystania z aplikacji i nie będzie przechodzić w stan uśpienia.

Aplikacje nie wyświetlają się w Menu z aplikacjami
Wszystkie aplikacje, które nie mają 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, na przykład 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 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 aplikacją, na przykład gdy aplikacja wykonuje jedną z tych czynności:

  • 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 wyłączył już hibernację 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 cech 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
    ma zainstalowanego Androida w wersji 13 lub nowszej, Informacje o aplikacji Wstrzymaj aktywność w aplikacji, jeśli jest nieużywana
    Urządzenie musi 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 platform

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 poniższą 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 go przywrócić po przetestowaniu:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Skrócenie czasu oczekiwania przez system. 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 lub nowszego) Sprawdź, czy aplikacja jest w stanie hibernacji, korzystając z jednej z tych metod:

    • Uwaga: na urządzeniu testowym wyświetli się powiadomienie, które wskazuje, ż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