Hibernacja aplikacji

Jeśli Twoja aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, a użytkownik nie interakcji z aplikacją przez kilka miesięcy, system umieści ją aplikacja jest w stanie hibernacji. System optymalizuje pod kątem dostępnego miejsca, a nie wydajności, a system chroni dane użytkownika. To działanie systemu jest podobne na to, co się dzieje, gdy użytkownik ręcznie wymusi zatrzymanie aplikacji w ustawieniach systemu.

Skutki hibernacji

Jak pokazano w tabeli 1, efekty hibernacji zależą od docelowego pakietu SDK aplikacji oraz urządzenie, na którym działa aplikacja:

Tabela 1. wpływ hibernacji na aplikację.
Wersja docelowego pakietu SDK Cechy urządzenia Efekty 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ł uprawnienia w ustawieniach systemu i zmienił poziom dostępu aplikacji na Deny (Odmów).

Aplikacja nie może uruchamiać zadań ani alertów w tle.

Aplikacja nie może otrzymywać powiadomień push, w tym powiadomień o wysokim priorytecie wysyłane przez Chmura Firebase Wiadomości.

Wszystkie pliki w aplikacji pamięci podręcznej.

Android 11 Android 11 Uprawnienia czasu działania aplikacji zostały zresetowane.
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 wejdzie w życie 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 po wyjściu aplikacji ze stanu 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 wykona jednak tych czynności:

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

    Użytkownik musi ponownie przyznać te uprawnienia aplikacji.

  2. Przełóż zlecenia, alerty i powiadomienia zaplanowane wcześniej Aplikacja przeszła w stan hibernacji.

    Aby ułatwić sobie pracę, skorzystaj z WorkManager. Możesz też dodać o zmianie harmonogramu ACTION_BOOT_COMPLETED odbiornika, który jest wywoływany, gdy aplikacja opuści hibernację i po uruchomieniu urządzenia.

Transmisja danych w aplikacjach

W sekcjach poniżej znajdziesz przykłady użycia aplikacji oraz przykłady Działania, których system nie uznaje za używanie 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, po którym aplikacja przechodzi 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 okna powiadomienie.

Pamiętaj, że używanie aplikacji do hibernacji nie wymaga 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órych usługa lub dostawca treści jest powiązany z inną aplikacją na urządzeniu; lub system operacyjny. Mogą to być na przykład edytory metod wprowadzania (IME) lub menedżery haseł.
  • Odbiorniki transmisji w pakiecie odbierające wprost 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 umożliwia zwolnienie na poziomie systemu z hibernacji aplikacji. 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 niewyświetlane w Menu z aplikacjami
Każda aplikacja, która nie ma aktywnego kafelka skrótów w programie uruchamiającym.
Aplikacje z 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ę 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 podwyższonymi 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;
Instalatory aplikacji innych firm
Sklepy z aplikacjami innych firm w celu automatycznego aktualizowania zainstalowanych aplikacji w razie potrzeby.

Zwolnienia użytkowników z hibernacji

Jeśli spodziewasz się, że hibernacja wpływa na główny przypadek użycia Twojej aplikacji, możesz poprosić użytkownika o zwolnienie z hibernacji aplikacji. To zwolnienie przydaje się w sytuacjach, gdy użytkownik oczekuje, że aplikacja będzie działać nawet wtedy, gdy użytkownik nie wchodzi w interakcję z aplikacją, np. wykonuje dowolną z tych czynności:

  • Zadbaj o bezpieczeństwo rodziny, okresowo zgłaszając jej lokalizację członków.
  • Synchronizowanie danych między urządzeniem a serwerem aplikacji.
  • komunikować się z urządzeniami smart, takimi jak telewizor;
  • Sparuj 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ę w aplikacji: skorzystaj z funkcji getUnusedAppRestrictionsStatus() API.

Więcej informacji o korzystaniu z tego interfejsu API w aplikacji znajdziesz w artykule Interfejs API 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 w aplikacji, możesz wysłać do użytkownika. 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 createManageUnusedAppRestrictionsIntent() API zgodnie z przykładowym kodem interfejsu API. Ten interfejs API tworzy intencję, która wczytuje w Ustawieniach ekran Informacje o aplikacji. Tutaj użytkownik może wyłączyć hibernację w aplikacji.

    Pamiętaj, by zadzwonić pod numer startActivityForResult(), a nie startActivity() podczas wysyłania tej intencji.

    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ę na urządzeniu
    Cechy urządzenia Strona, na której pojawia się ta opcja Nazwa opcji, którą chcesz wyłączyć
    ma 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
    Android 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 Google Play > Menu > Play Protect > Nieużywane uprawnienia aplikacje, Odbieranie uprawnień, jeśli aplikacja nie jest używana

Przykład kodu API

Ten przykładowy kod pokazuje, jak sprawdzić, czy hibernacja jest włączona dla oraz poprawny sposób proszenia 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)
}

Interfejs API starszej platformy

System operacyjny zawiera również interfejs API do hibernacji. funkcji. Interfejs API działa jednak tylko na urządzeniach z Androidem 11 lub nowszym. interfejs API nie obsługuje funkcji hibernacji, które są przeniesione do wcześniejszej wersji Wersje Androida. Dlatego nie zalecamy korzystania z niego.

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

Ręczne wywoływanie hibernacji

Aby przetestować zachowanie aplikacji po tym, jak system przejdzie w stan hibernacji , wykonaj te czynności:

  1. (Tylko Android 12 i nowsze wersje) Włącz hibernację na urządzenie:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Ustaw domyślny czas oczekiwania systemu na przejście w hibernację. Dzięki temu po zakończeniu testów możesz go przywrócić:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Skróć czas oczekiwania systemu. 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ę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) Upewnij się, że aplikacja jest w stanie hibernacji, za pomocą poniższych 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