Hibernacja aplikacji

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

Skutki hibernacji

Jak pokazano w tabeli 1, wpływ hibernacji zależy od docelowej wersji pakietu SDK aplikacji oraz od urządzenia, na którym jest ona 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,

Uprawnienia aplikacji przy uruchamianiu zostaną zresetowane. Działanie to ma taki sam efekt, jak gdyby użytkownik wyświetlił uprawnienia w ustawieniach systemu 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 za pomocą Komunikacji w chmurze Firebase.

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

Android 11 Android 11 Uprawnienia aplikacji przy uruchamianiu zostaną zresetowane.
Android 11 urządzenie musi mieć Androida w wersji od 6.0 (poziom interfejsu API 23) do 10 (poziom interfejsu API 29) włącznie i korzystać z Usług Google Play;

Uprawnienia aplikacji przy uruchamianiu zostaną zresetowane.

Ta zmiana zacznie obowiązywać w grudniu 2021 r. Więcej informacji znajdziesz w tym poście na blogu o udostępnianiu automatycznego resetowania uprawnień na miliardach urządzeń.

Zachowanie systemu, gdy aplikacja przestaje być w stanie hibernacji

Gdy użytkownik ponownie wejdzie w interakcję z aplikacją, wyjdzie ona z trybu 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 aplikacji uprawnienia czasu działania.

    Użytkownik musi ponownie przyznać aplikacji te uprawnienia.

  2. Zaplanuj ponownie 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 transmisji ACTION_BOOT_COMPLETED, który jest wywoływany, gdy aplikacja przestaje być w stanie hibernacji i po uruchomieniu urządzenia.

Transmisja danych w aplikacjach

W sekcjach poniżej znajdziesz przykłady użycia aplikacji oraz działań, które nie są uznawane za użycie aplikacji.

Przykłady użycia aplikacji

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

Na urządzeniach z Androidem 11 i nowszym za interakcje użytkownika uznaje się też te działania:

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

Warto zauważyć, że korzystanie z aplikacji w trybie hibernacji nie wymaga interakcji użytkownika. Dopóki wywoływany jest komponent pakietu, jest to nadal uważane za używanie aplikacji. Przykłady:

  • Aplikacje, które mają usługę lub dostawcę treści powiązanych z inną aplikacją na urządzeniu lub z systemem operacyjnym. Na przykład edytory metody wprowadzania (IME) lub menedżery haseł.
  • Odbiorniki transmisji w pakiecie odbierające jawną transmisję z pakietu zewnętrznego.

Przykłady

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

Wyjątki systemowe od hibernacji

Android przyznaje zwolnienia z hibernacji aplikacji na poziomie systemu w określonych przypadkach użycia. Jeśli Twoja aplikacja należy do jednej z tych kategorii, jest zwolniona z wymagań dotyczących korzystania z aplikacji i nie będzie przechodzić w stan uśpienia.

Aplikacje nie są wyświetlane w programie uruchamiającym
Każda aplikacja, która nie ma aktywnego kafelka skrótu w menu z aplikacjami.
Aplikacje profilu służbowego
Każda aplikacja zainstalowana przez użytkownika w profilu służbowym. Pamiętaj, że jeśli ta sama aplikacja znajduje się również w profilu osobistym, zwolniona jest tylko aplikacja w 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 operatora z uprawnieniami
Aplikacje, które operatorzy komórkowi wstępnie instalują na urządzeniach i uznają za niezbędne do wypełnienia zobowiązań umownych, np. aplikacje do poczty głosowej lub obsługi klienta.
Aplikacje instalacyjne innych firm
Sklepy innych firm z aplikacjami, które w razie potrzeby automatycznie aktualizują zainstalowane aplikacje.

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

Jeśli przewidujesz, że hibernacja wpłynie na podstawowy przypadek użycia w aplikacji, możesz poprosić użytkownika o wyjątek od hibernacji. To zwolnienie jest przydatne w sytuacjach, w których użytkownik oczekuje, że aplikacja będzie działać głównie w tle, nawet bez jego interakcji z nią, np. gdy aplikacja wykonuje jedną z tych czynności:

  • Zapewniać bezpieczeństwo rodzinie, okresowo raportując lokalizację jej członków.
  • Synchronizuj dane między urządzeniem a serwerem aplikacji.
  • komunikować się z inteligentnymi urządzeniami, np. telewizorem;
  • parować się z urządzeniami towarzyszącymi, takimi jak zegarek;

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

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

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

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

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

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

  1. Wyświetl interfejs, który wyjaśni użytkownikowi, dlaczego musi wyłączyć hibernację w przypadku Twojej aplikacji.
  2. Wywołaj interfejs API createManageUnusedAppRestrictionsIntent(), jak pokazano w przykładzie kodu interfejsu API. Ten interfejs API tworzy intencję, która w Ustawieniach wczytuje ekran Informacje o aplikacji. Użytkownik może tu wyłączyć hibernację aplikacji.

    Ważne jest, aby podczas wysyłania tego zamiaru wywoływać funkcję startActivityForResult(), a nie startActivity().

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

    Tabela 2. Opcja, która wyłącza hibernację aplikacji
    Cechy urządzenia Strona, na której pojawia się opcja Nazwa opcji do wyłączenia
    ma zainstalowanego 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 zainstalowanego Androida w wersji od 6.0 do 10 włącznie i korzysta z Usług Google Play, Aplikacja Play > Menu > Ochrona w Google Play > Uprawnienia 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 przypadku Twojej aplikacji, oraz jak prawidłowo poprosić użytkowników o wyłączenie hibernacji w przypadku Twojej 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)
}

Starsza wersja interfejsu 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 wcześniejszych wersji Androida. Dlatego nie zalecamy korzystania z interfejsu API.

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

Ręczne wywoływanie stanu hibernacji

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

  1. (Tylko Android 12 lub nowszy) Włącz na urządzeniu tryb hibernacji:

    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 po zakończeniu testowania możesz przywrócić poprzednią wersję:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Skróć czas oczekiwania systemu. W tym przykładzie system jest zmodyfikowany tak, aby aplikacja przechodziła w stan hibernacji dopiero sekundę po tym, jak przestaniesz z niej korzystać:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Poczekaj, aż na urządzeniu testowym zakończą się wszystkie transmisje uruchamiane podczas rozruchu, uruchamiając to polecenie:

    adb shell am wait-for-broadcast-idle
    

    Po zakończeniu transmisji polecenie zwróci ten 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. (Tylko Android 12 i nowsze wersje) Sprawdź, czy aplikacja jest w stanie hibernacji, korzystając z jednej z tych metod:

    • Na urządzeniu testowym pojawi się powiadomienie informujące o tym, że nieużywane aplikacje zostały przełączone w stan hibernacji.
    • Uruchom to polecenie:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Przywróć domyślny czas oczekiwania systemu przed wprowadzeniem aplikacji w stan hibernacji:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold