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 pod kątem dostępnego miejsca, a nie wydajności, a system chroni dane użytkownika. 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. wpływ hibernacji na aplikację.
Wersja docelowego pakietu SDK Cechy urządzenia Skutki hibernacji
Android 12 lub nowszy. ma zainstalowanego Androida 12 lub nowszego,

Środowisko wykonawcze aplikacji uprawnienia 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 ma zainstalowanego Androida 11, Uprawnienia czasu działania aplikacji są resetowane.
Android 11 ma Androida w wersji od 6.0 (poziom interfejsu API 23) do Androida 10 (poziom interfejsu API 29) włącznie, i jest wspierane przez Google Usługi Google Play

Uprawnienia czasu działania aplikacji zostały zresetowane.

Ta zmiana zacznie obowiązywać w grudniu 2021 r. Więcej informacji znajdziesz w tym blogu opublikuj na temat tworzenie automatyczne resetowanie uprawnień na miliardach innych urządzeń.

Zachowanie systemu, gdy aplikacja wychodzi z hibernacji

Gdy użytkownik wejdzie w interakcję z aplikacją, przestaje ona być w stanie hibernacji, mogą ponownie tworzyć oferty pracy, 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. Przełóż zlecenia, alerty i powiadomienia zaplanowane wcześniej Aplikacja przeszła 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óre są wywoływane, gdy aplikacja wychodzi z stanu hibernacji i 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 użycia aplikacji

Gdy aktywność w aplikacji jest 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 funkcje są też: które są uznawane za interakcje użytkownika:

  • Użytkownik wchodzi w interakcję z widżetem.
  • Użytkownik wchodzi w interakcję z powiadomieniem, z wyjątkiem zamknięcia powiadomienie.

Należy pamiętać, że korzystanie z aplikacji w trybie hibernacji nie wymaga wyraźnej interakcji użytkownika. Dopóki komponent pakietu będzie wywoływany, nadal będzie uwzględnia wykorzystanie 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. 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.

Elementy inne niż przykłady

Jeśli w aplikacji występują tylko zdarzenia opisane na poniższej liście, aplikacja przechodzi w stan hibernacji po kilku miesiącach:

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, zostanie zwolniona od standardów użytkowania aplikacjii nie przechodzi w stan hibernacji.

Aplikacje nie wyświetlają się w Menu z aplikacjami
Każda aplikacja, która nie ma aktywnego kafelka skrótów w programie uruchamiającym.
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ę również w profilu osobistym, tylko profil służbowy aplikacja profilu jest wykluczona.
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 uprawnieniami operatora
Każda aplikacja, którą operatorzy komórkowi wczytują na urządzeniach wstępnie i uznają za niezbędną zobowiązań umownych dotyczących usług, np. aplikacji do poczty głosowej lub obsługi klienta;
Aplikacje instalujące innych firm
Sklepy z aplikacjami innych firm w celu automatycznego aktualizowania zainstalowanych aplikacji w razie potrzeby.

Wyjątki dotyczące użytkowników z hibernacji

Jeśli przewidujesz, że tryb hibernacji będzie miał wpływ na główny przypadek użycia aplikacji, możesz poprosić użytkownika o zwolnienie z trybu 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 użytkownikiem, 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;
  • sparować 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ł już hibernację Twojej aplikacji, użyj interfejsu API getUnusedAppRestrictionsStatus().

Więcej informacji o korzystaniu z tego interfejsu API w aplikacji znajdziesz w tym artykule: przykładowy kod na tej stronie.

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

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

  1. wyświetlać interfejs użytkownika wyjaśniający, dlaczego musi wyłączyć usługę; do hibernacji aplikacji.
  2. Wywołaj interfejs API createManageUnusedAppRestrictionsIntent(), jak pokazano w przykładowym kodzie interfejsu API. Ten interfejs API tworzy intencję, która wczytuje w Ustawieniach ekran Informacje o aplikacji. Użytkownik może wyłączyć hibernację aplikacji.

    Podczas wysyłania tej intencji musisz wywołać funkcję startActivityForResult(), a nie startActivity().

    Jak pokazano 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ę opcja Nazwa opcji, którą chcesz wyłączyć
    mieć 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
    ma zainstalowanego Androida 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 jest w technologii Google Play usługi Aplikacja Sklep Play > Menu > Play Protect > Uprawnienia dla nieużywanych aplikacji Odbieranie uprawnień, jeśli aplikacja nie jest używana

Przykład kodu 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 zostały przeniesione do starszych wersji Androida. Dlatego nie zalecamy używania interfejsu API.

Jeśli chcesz tymczasowo nadal używać interfejsu API w celu zapewnienia zgodności, Jak z niego korzystać:

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 stan 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 poniższym przykładzie system jest zmodyfikowany tak, że aplikacja przechodzi w stan hibernacji tylko na sekundę. po zakończeniu interakcji z aplikacją:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Uruchom to polecenie, by zaczekać na zakończenie wszelkich transmisji na urządzeniu testowym. następujące 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 informujące, że: nieużywane aplikacje są zahibernowane.
    • Uruchom to polecenie:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Przywróć domyślny czas oczekiwania systemu przełączenie aplikacji w tryb hibernacji.

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold