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 pokazano w tabeli 1, efekty hibernacji zależą od docelowej wersji pakietu SDK aplikacji oraz od urządzenia, na którym działa aplikacja:

Tabela 1. Wpływ hibernacji na aplikację
Wersja docelowego pakietu SDK Cechy urządzenia Efekty 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 uruchamiać zadań ani alertów w tle.

Twoja 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 Android 11 Uprawnienia czasu działania aplikacji zostały zresetowane.
Android 11 Działa od Androida 6.0 (poziom interfejsu API 23) do Androida 10 (poziom interfejsu API 29) włącznie i korzysta z Usług Google Play

Uprawnienia czasu działania aplikacji zostały zresetowane.

Ta zmiana wejdzie w życie 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 po wyjściu aplikacji ze stanu hibernacji

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

System nie wykona jednak tych czynności:

  1. Ponownie przyznaj uprawnienia w czasie działania aplikacji.

    Użytkownik musi ponownie przyznać te uprawnienia aplikacji.

  2. Zmień harmonogram wszystkich zadań, alertów i powiadomień zaplanowanych przed przejściem aplikacji w stan hibernacji.

    Aby ułatwić sobie obsługę tego przepływu pracy, użyj WorkManagera. Możesz również dodać mechanizm zmiany harmonogramu w odbiorniku transmisji radiowej ACTION_BOOT_COMPLETED, który jest wywoływany, gdy aplikacja przechodzi w stan hibernacji i po włączeniu urządzenia.

Transmisja danych w aplikacjach

W sekcjach poniżej znajdziesz przykłady użycia aplikacji oraz przykłady działań, których system nie uznaje za używanie aplikacji.

Przykłady użycia 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 za interakcje użytkowników uważa się również te zachowania:

  • Użytkownik wchodzi w interakcję z widżetem.
  • Użytkownik wchodzi w interakcję z powiadomieniem, oprócz zamknięcia powiadomienia.

Warto zauważyć, że korzystanie z aplikacji do hibernacji nie wymaga bezpośredniej interakcji użytkownika. O ile wywoływany jest komponent pakietu, nadal jest to uważane za wykorzystanie w 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 w pakiecie odbierające wprost transmisję z pakietu zewnętrznego.

Elementy inne niż przykłady

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 umożliwia zwolnienie na poziomie systemu z hibernacji aplikacji. 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
Każda aplikacja, która nie ma aktywnego kafelka skrótów w programie uruchamiającym.
Aplikacje z profilu służbowego
Dowolna aplikacja, którą użytkownik zainstaluje w 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 umożliwiające sterowanie lokalnymi zasadami dotyczącymi urządzeń i aplikacjami systemowymi na urządzeniach.
Aplikacje z podwyższonymi uprawnieniami operatora
Każda aplikacja, którą operatorzy sieci komórkowych wstępnie ładują na urządzeniach i które mogą zostać uznane za niezbędne ze względu na zobowiązania umowne, np. poczta głosowa lub obsługa klienta.
Instalatory aplikacji innych firm
Sklepy z aplikacjami innych firm w razie potrzeby automatycznie aktualizują zainstalowane aplikacje.

Zwolnienia 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. Takie wykluczenie jest przydatne w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet jeśli nie wejdzie z nią w interakcję, np. gdy:

  • Zadbaj o bezpieczeństwo rodziny, okresowo zgłaszając lokalizację jej członków.
  • 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 zwolnienie, wykonaj czynności opisane w poniższych sekcjach.

Sprawdzanie, czy użytkownik wyłączył hibernację w aplikacji

Aby sprawdzić, czy użytkownik wyłączył hibernację w 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.

Poproś użytkownika o wyłączenie hibernacji w Twojej aplikacji

Jeśli użytkownik nie wyłączył jeszcze hibernacji w Twojej aplikacji, możesz wysłać do niego prośbę. W tym celu wykonaj następujące czynności:

  1. Wyświetl interfejs wyjaśniający użytkownikowi, dlaczego musi wyłączyć hibernację w aplikacji.
  2. Wywołaj interfejs API createManageUnusedAppRestrictionsIntent(), jak pokazano w przykładowym kodzie API. Ten interfejs API tworzy intencję, która wczytuje w Ustawieniach ekran Informacje o aplikacji. Tutaj użytkownik może wyłączyć hibernację w aplikacji.

    Wysyłając tę intencję, należy wywołać funkcję startActivityForResult(), a nie startActivity().

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

    Tabela 2. Opcja wyłączająca hibernację aplikacji
    Cechy urządzenia Strona, na której pojawia się ta opcja Nazwa opcji, którą chcesz wyłączyć
    ma zainstalowanego Androida 13 lub nowszego, Informacje o aplikacji Wstrzymywanie nieużywanej aktywności w aplikacjach
    Android 12 Informacje o aplikacji Odbieranie uprawnień i zwolnienie miejsca
    Android 11 Informacje o aplikacji > Uprawnienia Odbieranie uprawnień, jeśli aplikacja nie jest używana
    ma Androida w wersji od 6.0 do 10 włącznie i obsługuje Usługi Google Play. Aplikacja Google Play > Menu > Play Protect > Uprawnienia nieużywanych aplikacji Odbieranie uprawnień, jeśli aplikacja nie jest używana

Przykład kodu API

Z tego przykładowego kodu dowiesz się, jak sprawdzić, czy hibernacja jest włączona w aplikacji, i jak w prawidłowy sposób poprosić użytkowników o jej wyłączenie.

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)
}

Interfejs API starszej platformy

System operacyjny ma również 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 korzystania z niego.

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 tym, jak system przejdzie w stan hibernacji, wykonaj te czynności:

  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 hibernację. Dzięki temu po zakończeniu testów możesz go przywrócić:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Skróć czas oczekiwania systemu. W poniższym przykładzie system został zmodyfikowany tak, że aplikacja przechodzi w stan hibernacji tylko sekundę po tym, jak przestajesz z niej korzystać:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Poczekaj na zakończenie wszelkich transmisji 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ęcznie wywołaj proces hibernacji aplikacji:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Tylko Android 12 i nowsze wersje) Sprawdź, czy aplikacja jest zahibernowana, 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