Ottimizza l'utilizzo dei dati di rete

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

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

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 buona prassi per le app verificare se l'utente ha attivato la funzionalità 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 all'utilizzo dei dati vengono applicate. Il metodo getRestrictBackgroundStatus() restituisce uno dei seguenti valori:

RESTRICT_BACKGROUND_STATUS_DISABLED
La funzionalità Risparmio dati è disattivata.
RESTRICT_BACKGROUND_STATUS_ENABLED
L'utente ha attivato la funzionalità Risparmio dati per questa app. Le app devono cercare di limitare l'utilizzo dei dati in primo piano e gestire agevolmente le limitazioni relative all'utilizzo dei dati in background.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
L'utente ha attivato Risparmio dati, ma l'app può ignorarlo. Le app dovrebbero 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 la funzionalità Risparmio dati è disattivata o se l'app può ignorarla. Il seguente codice campione utilizza ConnectivityManager.isActiveNetworkMetered() e ConnectivityManager.getRestrictBackgroundStatus() per determinare la quantità di dati che l'app deve utilizzare:

Kotlin

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
    // 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.
    }
}

Java

ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
  // Checks user’s Data Saver settings.
  switch (connMgr.getRestrictBackgroundStatus()) {
    case RESTRICT_BACKGROUND_STATUS_ENABLED:
    // Background data usage is blocked for this app. Wherever possible,
    // the app should also use less data in the foreground.

    case 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.

    case 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. Invece di bloccare l'utilizzo in background, Android TV lo limita. Quando sono in primo piano, le applicazioni sono limitate a 800 Kbps, mentre in background le applicazioni sono limitate a 10 Kbps. Usa ConnectivityManager.isActiveNetworkMetered() per rilevare quando limitare l'utilizzo dei dati sulla TV.

Richiedi autorizzazioni di limitazione dati

Se la tua app deve utilizzare i dati in background, può richiedere autorizzazioni di limitazione dei dati inviando un intent Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS contenente un URI del nome del pacchetto dell'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 l'app. L'utente può quindi decidere se attivare i dati in background per l'app. Prima di inviare questo intent, è buona norma chiedere all'utente se vuole avviare l'app Impostazioni allo scopo di attivare l'utilizzo dei dati in background.

Monitora le modifiche alle preferenze per il 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 destinatario con Context.registerReceiver(). Quando un'app riceve questa trasmissione, deve controllare se le nuove preferenze Risparmio dati influiscono sulle sue autorizzazioni chiamando ConnectivityManager.getRestrictBackgroundStatus().

Nota: il sistema invia questa trasmissione solo alle app che si registrano in modo dinamico con Context.registerReceiver(). Le app che si registrano per ricevere questa trasmissione nel file manifest non le riceveranno.

Esegui il test con i comandi Android Debug Bridge

Android Debug Bridge (ADB) fornisce alcuni comandi che puoi utilizzare per testare l'app in condizioni di risparmio dati. Puoi controllare e configurare le autorizzazioni della rete o impostare le reti wireless a consumo per testare la tua app sulle reti unmetered.

$ adb shell dumpsys netpolicy
Genera un report che include l'impostazione corrente di limitazione della rete globale in background, gli UID dei pacchetti attualmente autorizzati a ignorare Risparmio dati e le autorizzazioni di rete di altri pacchetti noti.
$ adb shell cmd netpolicy
Mostra un elenco completo dei comandi di Network Policy Manager (netpolicy).
$ adb shell cmd netpolicy set restrict-background <boolean>
Abilita o disabilita la modalità Risparmio dati al superamento di 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, visualizzando se sono a consumo.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Imposta il Wi-Fi con l'SSID specificato a consumo, in modo da simulare una rete a consumo su una rete unmetered.