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, efekty hibernacji zależą 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
Androida 12 lub nowszą wersję, ma zainstalowanego Androida w wersji 12 lub nowszej,

Uprawnienia aplikacji przy uruchamianiu zostaną zresetowane. To działanie 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 ułatwić sobie ten proces, 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 przez system 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 lub 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 go nie zamyka.

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 uznawane za używanie aplikacji. Przykłady:

  • Aplikacje, które mają dostawcę usług lub treści powiązanego 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, które odbierają jawną transmisję z pakietu zewnętrznego.

Przykłady nieprawidłowych ofert

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 dowolne z tych działań:

  • Zapewniać bezpieczeństwo rodzinie, okresowo raportując lokalizację jej członków.
  • Synchronizowanie danych 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() API.

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 w przypadku 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śnia 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
    Android 13 lub nowszy. 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.0 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 hibernacji

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

  1. (Tylko Android 12 i 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ć poprzednie ustawienia:

    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 w czasie 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) 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