Hibernacja aplikacji

Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, a użytkownik nie wchodzi z nią w interakcję przez kilka miesięcy, system przeniesie ją w stan hibernacji. System optymalizuje pod kątem ilości miejsca, a nie wydajności, a system chroni dane użytkownika. To działanie systemu przypomina działanie, gdy użytkownik ręcznie wymusi 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. Wpływ hibernacji na aplikację
Docelowa wersja pakietu SDK Cechy urządzenia Skutki hibernacji
Android 12 lub nowszy ma zainstalowanego Androida 12 lub nowszego,

Uprawnienia czasu działania aplikacji zostaną zresetowane. 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 o udostępnianiu automatycznego resetowania uprawnień na miliardach urządzeń znajdziesz w tym poście na blogu.

Zachowanie systemu, gdy aplikacja wychodzi z hibernacji

Przy następnej interakcji użytkownika z aplikacją przestaje ona hibernacja i może ponownie 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

Po wznowieniu działania w aplikacji system uznaje 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 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órych dostawca usług lub treści jest powiązany z inną aplikacją na urządzeniu lub w systemie operacyjnym. Mogą to być na przykład edytory metod wprowadzania (IME) lub menedżery haseł.
  • Odbiorniki transmisji w pakiecie odbierające transmisję z pakietu zewnętrznego.

Przykłady nieprawidłowe

Jeśli w Twojej aplikacji występują tylko zachowania opisane na tej liście, po kilku miesiącach przechodzi w stan hibernacji:

Wykluczenia systemu z 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 i nie będzie w stanie hibernacji.

Aplikacje niewyświetlane 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ż w profilu osobistym, tylko aplikacja z profilem służbowym jest objęta wyjątkiem.
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 spodziewasz się, że hibernacja dotyczy głównego przypadku użycia Twojej aplikacji, możesz poprosić użytkownika o zwolnienie z 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 lokalizację członków rodziny;
  • 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 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 na temat korzystania z tego interfejsu API w aplikacji znajdziesz w przykładowym kodzie API na tej stronie.

Prośba o wyłączenie hibernacji przez użytkownika

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 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ę ta 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
    Android 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 są przeniesione do wcześniejszych wersji Androida. Dlatego nie zalecamy używania interfejsu API.

Jeśli chcesz tymczasowo nadal używać tego interfejsu API, aby zadbać o zgodność, poniżej znajdziesz informacje o tym, jak z niego korzystać:

Ręczne wywoływanie hibernacji

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

  1. (Tylko Android 12 i nowsze wersje) 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 zakończeniu testowania:

    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 i nowszych) Sprawdź, czy aplikacja jest w stanie hibernacji, korzystając z jednej z tych metod:

    • Zwróć uwagę, że urządzenie testowe wyświetla teraz powiadomienie, ż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