Ibernazione delle app

Se la tua app ha come target Android 11 (livello API 30) o versioni successive e l'utente non interagire con la tua app per qualche mese, il sistema inserisce in stato di ibernazione. Il sistema esegue l'ottimizzazione per lo spazio di archiviazione invece che per delle prestazioni e il sistema protegge i dati degli utenti. Questo comportamento del sistema è simile a ciò che accade quando l'utente interrompe manualmente l'interruzione dell'app dalle impostazioni di sistema.

Effetti della ibernazione

Come mostrato nella tabella 1, gli effetti della ibernazione dipendono dall'SDK target dell'app e il dispositivo su cui è in esecuzione l'app:

Tabella 1. Effetti della ibernazione sull'app
Versione SDK target Caratteristiche del dispositivo Effetti letargo
Android 12 o versioni successive Android 12 o versioni successive

Il runtime dell'app autorizzazioni. Questa azione ha lo stesso effetto che se l'utente ha visualizzato un'autorizzazione nelle impostazioni di sistema e modificato il livello di accesso dell'app su Rifiuta.

La tua app non può eseguire job o avvisi in background.

La tua app non può ricevere notifiche push, incluse quelle con priorità elevata di messaggi inviati tramite Firebase Cloud Messaggi.

Qualsiasi file nel tuo dell'app cache vengono rimosse.

Android 11 Con Android 11 Le autorizzazioni di runtime dell'app sono state reimpostate.
Android 11 Da Android 6.0 (livello API 23) ad Android 10 (livello API 29), inclusi. ed è fornito da Google Play Services

Le autorizzazioni di runtime dell'app sono state reimpostate.

Questo comportamento entrerà in vigore a dicembre 2021. Scopri di più in questo blog pubblica su relativa la reimpostazione automatica delle autorizzazioni è disponibile per miliardi di altri dispositivi.

Comportamento del sistema quando un'app lascia la modalità di ibernazione

La successiva interazione dell'utente con la tua app, quest'ultima esce dalla modalità di ibernazione possono creare di nuovo offerte di lavoro, avvisi e notifiche.

Tuttavia, il sistema non esegue le seguenti operazioni per la tua app:

  1. Concedi di nuovo le autorizzazioni di runtime dell'app.

    L'utente deve concedere nuovamente queste autorizzazioni per la tua app.

  2. Riprogramma eventuali lavori, avvisi e notifiche pianificati in precedenza la tua app è in ibernazione.

    Per supportare più facilmente questo flusso di lavoro, utilizza WorkManager. Puoi anche aggiungere della logica di ripianificazione ACTION_BOOT_COMPLETED Broadcast receiver, che viene richiamato quando l'app lascia la modalità di ibernazione dopo l'avvio del dispositivo.

Utilizzo di app

Le seguenti sezioni forniscono esempi di utilizzo delle app ed esempi di azioni che il sistema non considera come utilizzo dell'app.

Esempi di utilizzo delle app

Quando un'attività nella tua app viene viene ripristinato, il sistema considera questo evento come un'interazione dell'utente. Pertanto, il sistema estende il periodo di tempo che deve trascorrere prima che la tua app entri in ibernazione.

Su Android 11 e versioni successive, vengono inoltre rilevati i seguenti comportamenti considerate interazioni dell'utente:

  • L'utente interagisce con un widget.
  • L'utente interagisce con una notifica, ma non chiude il messaggio notifica.

Tieni presente che l'uso delle app per la ibernazione non richiede esplicitamente interazione dell'utente. Finché un componente del pacchetto viene richiamato, rimane considerato l'utilizzo dell'app. Alcuni esempi includono:

  • App con un fornitore di servizi o contenuti vincolato da un'altra app sul dispositivo o il sistema operativo. Ad esempio, IME (Input Method Editor) o gestori delle password.
  • I trasmettitori nel pacchetto ricevono una trasmissione esplicita da un pacchetto esterno.

Non esempi

Se la tua app presenta soltanto i comportamenti descritti nel seguente elenco: la tua app entra in ibernazione dopo alcuni mesi:

Esenzioni di sistema dalla ibernazione

In alcuni casi d'uso Android concede esenzioni a livello di sistema dalla ibernazione delle app. Se la tua app rientra in una delle seguenti categorie, è esente dagli standard di utilizzo delle app e non va in ibernazione.

App non visualizzate in Avvio app
Qualsiasi app che non abbia un riquadro di scorciatoia attivo in Avvio app.
App del profilo di lavoro
Qualsiasi app installata da un utente su un profilo di lavoro. Tieni presente che se la stessa app è presente anche in un profilo personale, solo lo spazio di lavoro dell'app del profilo è esente.
Controller dei criteri dei dispositivi
App che controllano criteri locali dei dispositivi e applicazioni di sistema sui dispositivi.
App con privilegi dell'operatore
Qualsiasi app che gli operatori di telefonia mobile precaricano sui dispositivi e che ritengano necessarie per obbligazioni contrattuali per i servizi, come le app di segreteria o assistenza clienti.
App di installazione di terze parti
Store di terze parti per aggiornamenti automatici delle app installate app quando necessario.

Esenzioni per gli utenti dalla ibernazione

Se prevedi che un caso d'uso principale nella tua app sia interessato dalla ibernazione, puoi richiedere all'utente un'esenzione dalla sospensione delle app. Questa esenzione è utile nelle situazioni in cui l'utente si aspetta che l'app funzioni principalmente in sullo sfondo, anche senza che l'utente interagisca con la tua app, ad esempio quando la tua app esegue una delle seguenti operazioni:

  • Proteggi la tua famiglia segnalando periodicamente la posizione della tua famiglia membri della community.
  • Sincronizza i dati tra un dispositivo e il server dell'app.
  • Comunicare con gli smart device, ad esempio una TV.
  • Accoppia con dispositivi associati, ad esempio un orologio.
di Gemini Advanced.

Per richiedere un'esenzione, completa i passaggi nelle sezioni seguenti.

Controllare se l'utente ha già disattivato la ibernazione per la tua app

Per controllare se l'utente ha già disattivato la modalità di ibernazione per la tua app: utilizza la getUnusedAppRestrictionsStatus() tramite Google Cloud CLI o tramite l'API Compute Engine.

Per ulteriori dettagli su come utilizzare questa API nella tua app, consulta API esempio di codice in questa pagina.

Chiedi all'utente di disattivare la modalità di ibernazione per la tua app

Se l'utente non ha già disattivato la modalità di ibernazione per la tua app, puoi inviare un richiesta all'utente. Per farlo, segui questi passaggi:

  1. Visualizza una UI che spieghi all'utente perché deve disattivarla di ibernazione per la tua app.
  2. Richiama createManageUnusedAppRestrictionsIntent() come mostrato nell'esempio di codice API. Questa API crea un intent che carica la schermata Informazioni app nelle Impostazioni. Da qui, l'utente può disattivare la modalità di ibernazione per la tua app.

    È importante chiamare startActivityForResult(), non startActivity(), quando invii questo intent.

    Come indicato nella tabella 2, la posizione e il nome dell'opzione dipendono dal caratteristiche del dispositivo su cui è installata la tua app:

    Tabella 2. Opzione che disattiva l'ibernazione per il tuo dell'app
    Caratteristiche del dispositivo Pagina in cui viene visualizzata l'opzione Nome dell'opzione da disattivare
    Android 13 o versioni successive Informazioni delle app Mettere in pausa l'attività nelle app se inutilizzata
    Con Android 12 Informazioni delle app Rimuovere le autorizzazioni e liberare spazio
    Con Android 11 Informazioni sull'app > Autorizzazioni Rimuovere le autorizzazioni se l'app non viene utilizzata
    dal sistema operativo Android 6.0 ad Android 10 inclusi e viene di Google Play App Google Play > Menu > Play Protect > Autorizzazioni per App Rimuovere le autorizzazioni se l'app non viene utilizzata

Esempio di codice API

Questo esempio di codice mostra come verificare se la modalità di ibernazione è abilitata per il tuo e il modo corretto per chiedere agli utenti di disattivare la ibernazione per la tua app.

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)
}

API Legacy Platform

Il sistema operativo include anche un'API per interagire con la modalità di ibernazione. funzionalità. Tuttavia, l'API funziona solo su dispositivi con Android 11 o versioni successive. l'API non gestisce le funzionalità di ibernazione di cui viene eseguito il backporting in precedenza Versioni di Android. Pertanto, sconsigliamo di utilizzare l'API.

Se devi continuare a utilizzare l'API temporaneamente per motivi di compatibilità, il seguente elenco mostra come utilizzarlo:

Richiama manualmente il comportamento di ibernazione

Per testare il comportamento della tua app dopo che il sistema la mette in stato di ibernazione completa i seguenti passaggi:

  1. (Solo Android 12 e versioni successive) Attiva il comportamento di ibernazione sul tuo dispositivo:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. Imposta il tempo predefinito di attesa del sistema prima che venga attivata la modalità di ibernazione. In questo modo, potrai ripristinarlo dopo aver eseguito il test:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. Riduci il tempo di attesa del sistema. Nell'esempio seguente, il sistema viene modificato in modo che la tua app entri in ibernazione solo per un secondo Quando smetti di interagire con l'app:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. Attendi il completamento delle trasmissioni all'avvio sul dispositivo di test eseguendo il seguente comando:

    adb shell am wait-for-broadcast-idle
    

    Al termine della trasmissione, questo comando restituisce il messaggio: All broadcast queues are idle!

  5. Richiama manualmente il processo di ibernazione delle app:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Solo Android 12 e versioni successive) Verificare che l'app sia in ibernazione, utilizzandone una uno dei seguenti metodi:

    • Osserva che ora il dispositivo di test mostra una notifica, che indica che le app inutilizzate vengono ibernate.
    • Esegui questo comando:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. Ripristina il periodo di tempo predefinito che il sistema attende prima dell'inserimento la tua app in ibernazione:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold