Hibernacja aplikacji

Jeśli Twoja aplikacja jest kierowana na Androida 11 (API na poziomie 30) lub nowszego, a użytkownik nie wchodzi z nią w interakcję przez kilka miesięcy, system przełącza ją w stan hibernacji. System optymalizuje miejsce na dane, a nie wydajność, i chroni dane użytkownika. To zachowanie systemu jest podobne do tego, co dzieje się, gdy użytkownik ręcznie wymusi zatrzymanie aplikacji w ustawieniach systemu.

Skutki hibernacji

Jak widać w tabeli 1, skutki hibernacji zależą od docelowej wersji pakietu SDK aplikacji oraz urządzenia, na którym aplikacja jest uruchomiona:

Tabela 1. Skutki hibernacji aplikacji
Wersja docelowa pakietu SDK Cechy urządzenia Skutki hibernacji
Android 12 lub nowszy, ma Androida 12 lub nowszego,

Uprawnienia w czasie działania aplikacji zostaną zresetowane. To działanie ma taki sam skutek, jak gdyby użytkownik wyświetlił uprawnienie w ustawieniach systemowych i zmienił poziom dostępu aplikacji na Odmów.

Aplikacja nie może uruchamiać zadań ani 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.

Pliki w pamięci podręcznej aplikacji zostaną usunięte.

Android 11 Android 11 Uprawnienia aplikacji w czasie działania zostaną zresetowane.
Android 11 ma Androida w wersji od 6.0 (poziom interfejsu API 23) do 10 (poziom interfejsu API 29) i korzysta z Usług Google Play;

Uprawnienia aplikacji w czasie działania zostaną zresetowane.

Ta zmiana wejdzie w życie w grudniu 2021 r. Więcej informacji znajdziesz w tym poście na blogu o udostępnianiu automatycznego resetowania uprawnień na miliardach kolejnych urządzeń.

Zachowanie systemu, gdy aplikacja wychodzi ze stanu hibernacji

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

System nie wykonuje jednak tych czynności w przypadku Twojej aplikacji:

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

    Użytkownik musi ponownie przyznać te uprawnienia aplikacji.

  2. Ponownie zaplanuj wszystkie zadania, alerty i powiadomienia, które zostały zaplanowane przed przejściem aplikacji w stan hibernacji.

    Aby łatwiej obsługiwać ten przepływ pracy, użyj WorkManagera. Możesz też dodać logikę ponownego planowania w odbiorniku komunikatów ACTION_BOOT_COMPLETED, który jest wywoływany, gdy aplikacja wychodzi ze stanu hibernacji i po uruchomieniu urządzenia.

Transmisja danych w aplikacjach

W sekcjach poniżej znajdziesz przykłady korzystania z aplikacji, a także przykłady działań, których system nie uznaje za korzystanie z aplikacji.

Przykłady korzystania z aplikacji

Gdy aktywność w aplikacji zostanie wznowiona, system uzna to zdarzenie za interakcję użytkownika. Dlatego system wydłuża czas, zanim aplikacja przejdzie w stan hibernacji.

Na Androidzie 11 i nowszych za interakcje użytkownika uznawane są też te działania:

  • Użytkownik wchodzi w interakcję z widżetem.
  • Użytkownik wchodzi w interakcję z powiadomieniem, ale nie odrzuca powiadomienia.

Należy pamiętać, że korzystanie z aplikacji w celu hibernacji nie wymaga wyraźnej interakcji użytkownika. Dopóki wywoływany jest komponent pakietu, jest to nadal uznawane za korzystanie z aplikacji. Przykłady:

  • aplikacje, które mają usługę lub mechanizm dostarczania treści powiązane z inną aplikacją na urządzeniu lub z systemem operacyjnym; Na przykład edytory metod wprowadzania (IME) lub menedżery haseł.
  • Odbiorniki transmisji w pakiecie odbierające bezpośrednią transmisję z pakietu zewnętrznego.

Przykłady nieprawidłowe

Jeśli Twoja aplikacja wykazuje tylko zachowania opisane na poniższej liście, po kilku miesiącach zostanie przełączona w tryb hibernacji:

Wyjątki systemowe od hibernacji

W niektórych przypadkach Android przyznaje zwolnienia z hibernacji aplikacji na poziomie systemu. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona ze standardów korzystania z aplikacji i nie zostanie przełączona w tryb hibernacji.

Aplikacje nie są wyświetlane w Menu z aplikacjami
Każda aplikacja, która nie ma aktywnego kafelka skrótu w menu z aplikacjami.
Aplikacje w profilu służbowym
Każda aplikacja, którą użytkownik instaluje w profilu służbowym. Pamiętaj, że jeśli ta sama aplikacja znajduje się też na profilu osobistym, zwolnienie dotyczy tylko aplikacji na profilu służbowym.
Kontrolery zasad dotyczących urządzeń
Aplikacje, które kontrolują lokalne zasady dotyczące urządzeń i aplikacje systemowe na urządzeniach.
Aplikacje z uprawnieniami operatora
Aplikacje, które operatorzy sieci komórkowych wstępnie instalują na urządzeniach i uznają za niezbędne do wypełnienia zobowiązań wynikających z umowy, np. aplikacje do obsługi poczty głosowej lub obsługi klienta.
Aplikacje instalacyjne innych firm
Sklepy innych firm z aplikacjami, aby w razie potrzeby automatycznie aktualizować zainstalowane aplikacje.

Wyłączenie użytkowników z hibernacji

Jeśli przewidujesz, że hibernacja może mieć wpływ na podstawowy przypadek użycia aplikacji, możesz poprosić użytkownika o wyłączenie hibernacji. To zwolnienie jest przydatne w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet bez interakcji z użytkownikiem, np. gdy aplikacja:

  • Zapewnianie bezpieczeństwa rodzinie przez okresowe raportowanie lokalizacji członków grupy rodzinnej.
  • synchronizować dane między urządzeniem a serwerem aplikacji;
  • komunikować się z inteligentnymi urządzeniami, takimi jak telewizor;
  • parować z urządzeniami towarzyszącymi, takimi jak zegarek;

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

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

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

Więcej informacji o tym, jak używać tego interfejsu API w aplikacji, znajdziesz w przykładzie kodu interfejsu API na tej stronie.

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

Jeśli użytkownik nie wyłączył jeszcze hibernacji aplikacji, możesz wysłać mu prośbę. Aby to zrobić, wykonaj te czynności:

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

    Podczas wysyłania tej intencji ważne jest, aby wywołać startActivityForResult(), a nie startActivity().

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

    Tabela 2. Opcja wyłączająca hibernację aplikacji
    Cechy urządzenia Strona, na której pojawia się opcja Nazwa opcji, którą chcesz wyłączyć
    ma Androida 13 lub nowszego, Informacje o aplikacji Wstrzymaj aktywność w aplikacji, jeśli jest nieużywana
    Android 12 Informacje o aplikacji Usuń uprawnienia i zwolnij miejsce
    Android 11 Informacje o aplikacji > Uprawnienia Usuń uprawnienia, jeśli aplikacja jest nieużywana
    ma system Android w wersji od 6.0 do 10 i korzysta z Usług Google Play; Aplikacja Google Play > Menu > Play Protect > Uprawnienia nieużywanych aplikacji Usuń uprawnienia, jeśli aplikacja jest nieużywana

Przykładowy kod interfejsu API

Ten przykładowy kod pokazuje, jak sprawdzić, czy hibernacja jest włączona w aplikacji, oraz jak prawidłowo 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)
}

Starszy interfejs 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 on funkcji hibernacji, które zostały przeniesione do wcześniejszych wersji Androida. Dlatego nie zalecamy korzystania z interfejsu API.

Jeśli ze względu na zgodność musisz tymczasowo nadal używać interfejsu API, na tej liście znajdziesz informacje o tym, jak to zrobić:

Ręczne wywoływanie hibernacji

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

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

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Ustaw domyślny czas oczekiwania systemu przed przejściem w stan hibernacji. Dzięki temu po zakończeniu testów będzie można ją przywrócić:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Skróć czas oczekiwania systemu. W tym przykładzie system został zmodyfikowany tak, aby aplikacja przechodziła w stan hibernacji już po sekundzie od zakończenia interakcji z nią:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Poczekaj, aż na urządzeniu testowym zakończą się wszystkie transmisje podczas uruchamiania, 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 w stanie hibernacji, korzystając z jednej z tych metod:

    • Zauważ, że na urządzeniu testowym wyświetla się teraz powiadomienie o tym, ż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 przełączeniem aplikacji w tryb hibernacji:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold