Ottimizza l'utilizzo dei dati di rete

Nel corso della vita di uno smartphone, il costo di un piano dati mobile può superare il costo del dispositivo stesso. Su Android 7.0 (livello API 24) e versioni successive, gli utenti possono attivare Risparmio dati su tutto il dispositivo per ottimizzare l'utilizzo dei dati del dispositivo e consumare meno dati. Questa funzionalità è particolarmente utile in roaming, verso la fine del ciclo di fatturazione o per un piccolo pacchetto dati prepagato.

Quando un utente attiva Risparmio dati in Impostazioni e il dispositivo è su una rete a consumo, il sistema blocca l'utilizzo dei dati in background e segnala alle app di utilizzare meno dati in primo piano, ove possibile. Gli utenti possono consentire ad app specifiche di utilizzare i dati a consumo in background anche quando la funzionalità Risparmio dati è attiva.

Android 7.0 (livello API 24) estende l'API ConnectivityManager per fornire alle app un modo per recuperare le preferenze di Risparmio dati dell'utente e monitorare le modifiche alle preferenze. È considerata una buona prassi per le app verificare se l'utente ha attivato Risparmio dati e cercare di limitare l'utilizzo dei dati in primo piano e in background.

Controlla le preferenze di Risparmio dati

Su Android 7.0 (livello API 24) e versioni successive, le app possono utilizzare l'API ConnectivityManager per determinare quali limitazioni di utilizzo dei dati vengono applicate. Il metodo getRestrictBackgroundStatus() restituisce uno dei seguenti valori:

RESTRICT_BACKGROUND_STATUS_DISABLED
Risparmio dati è disattivato.
RESTRICT_BACKGROUND_STATUS_ENABLED
L'utente ha attivato Risparmio dati per questa app. Le app devono cercare di limitare l'utilizzo dei dati in primo piano e gestire correttamente le limitazioni all'utilizzo dei dati in background.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
L'utente ha attivato Risparmio dati, ma l'app è autorizzata a bypassarlo. Le app devono comunque cercare di limitare l'utilizzo dei dati in primo piano e in background.

Limita l'utilizzo dei dati ogni volta che il dispositivo è connesso a una rete a consumo, anche se Risparmio dati è disattivato o l'app è autorizzata a bypassarlo. Il seguente codice campione utilizza ConnectivityManager.isActiveNetworkMetered() e ConnectivityManager.getRestrictBackgroundStatus() per determinare la quantità di dati che l'app deve utilizzare:

with(getSystemService(ConnectivityManager::class.java)) {
    // Checks if the device is on a metered network.
    if (isActiveNetworkMetered) {
        // Checks user’s Data Saver settings.
        when (restrictBackgroundStatus) {
            RESTRICT_BACKGROUND_STATUS_ENABLED -> {
                // Background data usage is blocked for this app. Wherever possible,
                // the app should also use less data in the foreground.
            }
            RESTRICT_BACKGROUND_STATUS_WHITELISTED -> {
                // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
                // the app should use less data in the foreground and background.
            }
            RESTRICT_BACKGROUND_STATUS_DISABLED -> {
                // Data Saver is disabled. Since the device is connected to a
                // metered network, the app should use less data wherever possible.
            }
        }
    } else {
        // The device is not on a metered network.
        // Use data as required to perform syncs, downloads, and updates.
    }
}

Nota: questo comportamento è diverso su Android TV. Anziché bloccare l'utilizzo in background, Android TV lo limita. Quando sono in primo piano, le applicazioni sono limitate a 800 Kbps, mentre quando sono in background sono limitate a 10 Kbps. Utilizza ConnectivityManager.isActiveNetworkMetered() per rilevare quando limitare l'utilizzo dei dati sulla TV.

Richiedi le autorizzazioni per la limitazione dei dati

Se la tua app deve utilizzare i dati in background, può richiedere le autorizzazioni di limitazione dei dati inviando un intent Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS contenente un URI del nome del pacchetto della tua app, ad esempio package:MY_APP_ID.

L'invio dell'intent e dell'URI avvia l'app Impostazioni e visualizza le impostazioni di utilizzo dei dati per la tua app. L'utente può quindi decidere se attivare i dati in background per la tua app. Prima di inviare questo intent, è buona norma chiedere all'utente se vuole avviare l'app Impostazioni per attivare l'utilizzo dei dati in background.

Monitora le modifiche alle preferenze di Risparmio dati

Le app possono monitorare le modifiche alle preferenze di Risparmio dati creando un BroadcastReceiver per ascoltare ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED e registrando dinamicamente il ricevitore con Context.registerReceiver(). Quando un'app riceve questa trasmissione, deve verificare se le nuove preferenze di Risparmio dati influiscono sulle sue autorizzazioni chiamando ConnectivityManager.getRestrictBackgroundStatus().

Nota: il sistema invia questa trasmissione solo alle app che si registrano dinamicamente per riceverla con Context.registerReceiver(). Le app che si registrano per ricevere questa trasmissione nel proprio manifest non la riceveranno.

Esegui test con i comandi Android Debug Bridge

Android Debug Bridge (ADB) fornisce alcuni comandi che puoi utilizzare per testare la tua app in condizioni di Risparmio dati. Puoi controllare e configurare le autorizzazioni di rete o impostare le reti wireless come a consumo per testare la tua app su reti non a consumo.

$ adb shell dumpsys netpolicy
Genera un report che include l'impostazione attuale della limitazione della rete in background globale, gli UID dei pacchetti attualmente autorizzati ad aggirare il Risparmio dati e le autorizzazioni di rete di altri pacchetti noti.
$ adb shell cmd netpolicy
Visualizza un elenco completo dei comandi di Network Policy Manager (netpolicy).
$ adb shell cmd netpolicy set restrict-background <boolean>
Attiva o disattiva la modalità Risparmio dati quando passi rispettivamente true o false.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Aggiunge l'UID del pacchetto specificato alla lista consentita (whitelist) per consentire l'utilizzo dei dati a consumo in background.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Rimuove l'UID del pacchetto specificato dalla lista consentita (whitelist) per bloccare l'utilizzo dei dati a consumo in background quando è attiva la funzionalità Risparmio dati.
$ adb shell cmd netpolicy list wifi-networks
Elenca tutte le reti Wi-Fi, indicando se sono a consumo.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Imposta il Wi-Fi con l'SSID specificato come a consumo, consentendoti di simulare una rete a consumo su una rete non a consumo.