Limitazioni di sistema relative al lavoro in background

I processi in background possono richiedere molta memoria e batteria. Ad esempio, un la trasmissione implicita può avviare molti processi in background registrati resta in ascolto, anche se questi processi potrebbero non produrre molto lavoro. Questo può avere un un impatto significativo sia sulle prestazioni del dispositivo sia sull'esperienza utente.

Per evitare limitazioni di sistema, assicurati di utilizzare l'API giusta per il tuo in background. La La documentazione della panoramica delle attività in background ti aiuta a scegliere l'API giusta per le tue esigenze.

Limitazioni avviate dall'utente

Se un'app mostra alcuni dei comportamenti dannosi descritti in Android vitals, il sistema chiede all'utente di limitare l'accesso di quell'app alle risorse di sistema.

Se il sistema rileva un consumo eccessivo di risorse, invia una notifica l'utente, offrendogli la possibilità di limitare le azioni dell'app. I comportamenti che possono attivare la notifica includono:

  1. Wakelock eccessivi: 1 wakelock parziale mantenuto per un'ora quando lo schermo è attivo non attivo
  2. Servizi in background eccessivi: se l'app ha come target livelli API inferiori a 26. e ha servizi in background eccessivi

Le precise limitazioni imposte sono stabilite dal produttore del dispositivo. Per Ad esempio, nelle build AOSP, le app con restrizioni non possono eseguire job, attivare gli allarmi o utilizzare verso la rete, tranne quando l'app è in primo piano.

Limitazioni relative alla ricezione di annunci di attività di rete

Le app non ricevono annunci su CONNECTIVITY_ACTION se si registrano a riceverle nel file manifest e i processi che dipendono da questa non verrà avviata. Questo potrebbe rappresentare un problema per le app che vogliono ascoltare la rete modifiche o eseguire attività di rete in blocco quando il dispositivo si connette a non a consumo. Diverse soluzioni per aggirare questa limitazione esiste nel framework Android, ma la scelta di quella giusta dipende da cosa che la tua app possa raggiungere.

Programma il lavoro su connessioni unmetered

Quando crei un WorkRequest, aggiungi un NetworkType.UNMETERED Constraint.

fun scheduleWork(context: Context) {
    val workManager = WorkManager.getInstance(context)
    val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
       .setConstraints(
           Constraints.Builder()
               .setRequiredNetworkType(NetworkType.UNMETERED)
               .build()
           )
       .build()

    workManager.enqueue(workRequest)
}

Quando le condizioni del tuo lavoro sono soddisfatte, la tua app viene richiamata per l'esecuzione il metodo doWork() nella classe Worker specificata.

Monitora la connettività di rete mentre l'app è in esecuzione

Le app in esecuzione possono comunque ascoltare CONNECTIVITY_CHANGE con un ha registrato BroadcastReceiver. Tuttavia, l'API ConnectivityManager fornisce un metodo più affidabile per richiedere un callback solo quando la rete specificata che le condizioni siano soddisfatte.

Gli oggetti NetworkRequest definiscono i parametri del callback di rete in termini di NetworkCapabilities. Puoi creare oggetti NetworkRequest con il corso NetworkRequest.Builder. registerNetworkCallback poi passa l'oggetto NetworkRequest al sistema. Quando la rete se vengono soddisfatte determinate condizioni, l'app riceve un callback per eseguire onAvailable() definito nel suo ConnectivityManager.NetworkCallback.

L'app continua a ricevere callback finché non viene chiusa o non viene avviata la chiamata unregisterNetworkCallback().

Limitazioni relative alla ricezione di trasmissioni di immagini e video

Le app non possono inviare o ricevere ACTION_NEW_PICTURE o Trasmissioni ACTION_NEW_VIDEO. Questa restrizione aiuta ad alleviare le prestazioni e l'esperienza utente influiscono sul momento in cui diverse app devono attivarsi in ordine per elaborare una nuova immagine o un nuovo video.

Determinare quali autorità dei contenuti hanno attivato il lavoro

WorkerParameters consente alla tua app di ricevere informazioni utili su cosa le autorità relative ai contenuti e gli URI hanno attivato l'operazione:

List<Uri> getTriggeredContentUris()

Restituisce un elenco di URI che hanno attivato l'operazione. Il campo è vuoto se o nessun URI ha attivato l'operazione (ad esempio, l'operazione è stata attivata a causa di una scadenza o qualche altro motivo), oppure il numero di URI modificati è maggiore di 50.

List<String> getTriggeredContentAuthorities()

Restituisce un elenco di stringhe di autorità sui contenuti che hanno attivato l'elaborazione. Se l'elenco restituito non è vuoto, utilizza getTriggeredContentUris() per recuperare i dettagli di quali URI sono stati modificati.

Il seguente codice campione sostituisce il metodo CoroutineWorker.doWork() e registra le autorità competenti per i contenuti e gli URI che hanno attivato il job:

class MyWorker(
    appContext: Context,
    params: WorkerParameters
): CoroutineWorker(appContext, params)
    override suspend fun doWork(): Result {
        StringBuilder().apply {
            append("Media content has changed:\n")
            params.triggeredContentAuthorities
                .takeIf { it.isNotEmpty() }
                ?.let { authorities ->
                    append("Authorities: ${authorities.joinToString(", ")}\n")
                    append(params.triggeredContentUris.joinToString("\n"))
                } ?: append("(No content)")
            Log.i(TAG, toString())
        }
        return Result.success()
    }
}

Testa l'app in base alle limitazioni di sistema

L'ottimizzazione delle app per l'esecuzione su dispositivi con memoria ridotta o in condizioni di memoria ridotta: possono migliorare le prestazioni e l'esperienza utente. Rimozione delle dipendenze in background e i broadcast receiver impliciti registrati nel manifest possono aiutare la tua app funzionano meglio su questi dispositivi. Ti consigliamo di ottimizzare l'app per l'esecuzione senza dover utilizzare del tutto questi processi in background.

Alcuni comandi aggiuntivi di Android Debug Bridge (ADB) possono aiutarti a testare l'app comportamento con i processi in background disattivati:

  • Per simulare condizioni in cui le trasmissioni implicite e i servizi in background sono non disponibile, inserisci il seguente comando:

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore

  • Per riattivare le trasmissioni implicite e i servizi in background, inserisci quanto segue :

    $ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow

Ottimizza ulteriormente la tua app

Scopri altri modi efficaci per ottimizzare le tue attività in background: il comportamento degli utenti, consulta Ottimizzare l'utilizzo della batteria per le API di pianificazione delle attività documentazione.