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 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 Urządzenie musi działać na Androidzie 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 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 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, 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, tylko aplikacja na profilu służbowym jest zwolniona z ograniczeń.
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 lokalizację 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 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 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 zakończeniu interakcji z nią:

    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:

    • 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