Hibernacja aplikacji

Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, a użytkownik nie korzysta z niej przez kilka miesięcy, system przełączy ją w stan hibernacji. System optymalizuje skuteczność pod kątem dostępnego miejsca, a nie wydajności, a także chroni dane użytkowników. Przypomina to zachowanie systemu, 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, a także od urządzenia, na którym aplikacja jest uruchomiona:

Tabela 1. Wpływ hibernacji na aplikację
Docelowa wersja pakietu SDK Charakterystyka urządzenia Efekty hibernacji
Androida 12 lub nowszego, ma zainstalowanego Androida 12 lub nowszego,

Uprawnienia środowiska wykonawczego aplikacji zostaną zresetowane. To działanie daje taki sam efekt 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, które są wysyłane przez Komunikację w chmurze Firebase.

Wszystkie pliki z pamięci podręcznej aplikacji zostaną usunięte.

Android 11 ma Androida 11. Uprawnienia czasu działania aplikacji są resetowane.
Android 11 Obsługuje Androida 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 temat udostępniania automatycznego resetowania uprawnień miliardom kolejnych urządzeń.

Zachowanie systemu, gdy aplikacja przechodzi ze stanu hibernacji

Gdy użytkownik wejdzie w interakcję z aplikacją, zakończy hibernację i może ponownie utworzyć zadania, alerty i powiadomienia.

W przypadku aplikacji system nie wykona jednak tych czynności:

  1. Ponownie przyznaj uprawnienia czasu działania aplikacji.

    Użytkownik musi ponownie przyznać te uprawnienia aplikacji.

  2. przełożyć zadania, alerty i powiadomienia, które zostały zaplanowane, zanim aplikacja przejdzie w stan hibernacji;

    Aby ułatwić sobie obsługę tego przepływu pracy, użyj usługi WorkManager. Możesz też dodać funkcję zmiany harmonogramu w odbiorniku transmisji ACTION_BOOT_COMPLETED, która jest wywoływana, gdy aplikacja przejdzie w stan hibernacji i po uruchomieniu urządzenia.

Transmisja danych w aplikacjach

W kolejnych sekcjach znajdziesz przykłady użycia aplikacji oraz działania, których system nie uznaje za takie korzystanie.

Przykłady użycia aplikacji

Po wznowieniu działania w aplikacji system uzna to zdarzenie za interakcję użytkownika. W związku z tym system wydłuża okres hibernacji aplikacji.

W Androidzie 11 i nowszych za interakcje użytkowników uznaje się też takie zachowania:

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

Pamiętaj, że używanie aplikacji do hibernacji nie wymaga bezpośrednio interakcji z użytkownikiem. Dopóki komponent pakietu jest wywoływany, uznaje się go za użycie 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. Dotyczy to na przykład edytorów metody wprowadzania (IME) lub menedżerów haseł.
  • Odbiorniki w pakiecie otrzymują wyraźną transmisję z pakietu zewnętrznego.

Inne niż przykłady

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

Wykluczenia systemu z powodu hibernacji

W określonych przypadkach Android pozwala na wyjątki od hibernacji aplikacji na poziomie systemu. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona ze standardów użytkowania i nie podlega hibernacji.

Aplikacje niewyświetlane w Menu z aplikacjami
Wszystkie aplikacje, które nie mają aktywnego kafelka skrótu w Menu z aplikacjami.
Aplikacje 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, wykluczona jest tylko aplikacja profilu służbowego.
Kontrolery zasad dotyczących urządzeń
Aplikacje kontrolujące lokalne zasady dotyczące urządzeń i aplikacje systemowe na urządzeniach.
Aplikacje uprzywilejowane przez operatora
Wszelkie aplikacje, które operatorzy komórkowi wstępnie pobierają na urządzenia i uważają za niezbędne w związku z umowami o świadczenie usług (np. aplikacje poczty głosowej lub aplikacje do obsługi klienta).
Aplikacje instalacyjne innych firm
Sklepy z aplikacjami innych firm, aby w razie potrzeby automatycznie aktualizować zainstalowane aplikacje.

Wykluczenie użytkowników z trybu hibernacji

Jeśli uważasz, że hibernacja wpływa na główny przypadek użycia aplikacji, możesz poprosić użytkownika o zwolnienie z tego trybu. To wykluczenie przydaje się wtedy, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet wtedy, gdy nie wchodzi on w interakcję z aplikacją, np. gdy:

  • Zadbaj o bezpieczeństwo rodziny, okresowo zgłaszając lokalizację jej członków.
  • Synchronizuj dane między urządzeniem a serwerem aplikacji.
  • komunikować się z urządzeniami takimi jak telewizor;
  • Sparuj z urządzeniami towarzyszącymi, np. z zegarkiem.

Aby poprosić o zwolnienie, wykonaj czynności opisane w poniższych sekcjach.

Sprawdź, czy użytkownik wyłączył już hibernację w Twojej aplikacji

Aby sprawdzić, czy użytkownik wyłączył hibernację w Twojej aplikacji, użyj interfejsu API getUnusedAppRestrictionsStatus().

Więcej informacji o używaniu tego interfejsu API w aplikacji znajdziesz w przykładowym kodzie interfejsu 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ć mu prośbę. Aby to zrobić:

  1. Wyświetlaj interfejs z wyjaśnieniem, dlaczego musi wyłączyć hibernację w aplikacji.
  2. Wywołaj interfejs API createManageUnusedAppRestrictionsIntent() w sposób pokazany w przykładowym kodzie API. Ten interfejs API tworzy intencję, która wczytuje ekran Informacje o aplikacji w Ustawieniach. W tym miejscu użytkownik może wyłączyć hibernację w aplikacji.

    Ważne jest, by podczas wysyłania tej intencji wywołać metodę startActivityForResult(), a nie startActivity().

    Jak pokazano w tabeli 2, lokalizacja i nazwa opcji zależą od parametrów urządzenia, na którym jest zainstalowana Twoja aplikacja:

    Tabela 2. Opcja, która wyłącza hibernację aplikacji
    Charakterystyka urządzenia Strona, na której pojawia się opcja Nazwa opcji, którą chcesz wyłączyć
    ma system Android 13 lub nowszy, Informacje o aplikacji Wstrzymywanie nieużywanej aktywności w aplikacji
    ma Androida 12, Informacje o aplikacji Odbieranie uprawnień i zwalnianie miejsca
    ma Androida 11. Informacje o aplikacji > Uprawnienia Usuwanie uprawnień, gdy aplikacja nie jest używana
    ma Androida w wersji od 6.0 do 10 włącznie oraz korzysta z Usług Google Play. Aplikacja Play > Menu > Play Protect > Uprawnienia dla nieużywanych aplikacji Usuwanie uprawnień, gdy aplikacja nie jest używana

Przykładowy kod interfejsu API

Ten przykładowy kod pokazuje, jak sprawdzić, czy hibernacja jest włączona w przypadku Twojej aplikacji, i w jaki 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)
}

Starsza wersja interfejsu API platformy

System operacyjny zawiera też interfejs API do interakcji z funkcją hibernacji. Działa on jednak tylko na urządzeniach z Androidem 11 lub nowszym. Nie obsługuje funkcji hibernacji, które zostały przeniesione do wcześniejszych wersji Androida. Dlatego nie zalecamy korzystania z niego.

Jeśli chcesz tymczasowo nadal używać interfejsu API, aby zachować zgodność, skorzystaj z tej listy:

Ręczne wywoływanie działania hibernacji

Aby przetestować zachowanie aplikacji po tym, jak system umieści ją w stanie hibernacji, wykonaj te czynności:

  1. (Tylko Android 12 i nowsze) Włącz funkcję hibernacji na urządzeniu:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Ustaw domyślny czas, przez jaki system czeka na przejście do hibernacji. W ten sposób możesz przywrócić konto po przetestowaniu:

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

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Poczekaj na zakończenie wszystkich komunikatów wyświetlanych podczas uruchamiania 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) Upewnij się, że aplikacja jest hibernowana, korzystając z jednej z tych metod:

    • Zwróć uwagę, że urządzenie testowe wyświetla teraz powiadomienie informujące, że nieużywane aplikacje są hibernowane.
    • Uruchom to polecenie:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Przywróć domyślny czas, przez jaki system czeka, zanim aplikacja przejdzie w stan hibernacji:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold