Ottimizza l'utilizzo dei dati di rete

Nel corso del ciclo di vita di uno smartphone, il costo di un piano dati cellulare può facilmente superiore al costo del dispositivo stesso. Su Android 7.0 (livello API 24) e maggiore, gli utenti possono attivare Risparmio dati a livello di dispositivo per ottimizzare l'utilizzo dei dati da parte del dispositivo e usare meno dati. Questa possibilità è particolarmente utile in roaming, quasi alla fine del ciclo di fatturazione. o un piccolo pacchetto dati prepagato.

Quando un utente attiva Risparmio dati nelle Impostazioni e il dispositivo viene su una rete a consumo, il sistema blocca l'utilizzo dei dati e i segnali in background di utilizzare meno dati in primo piano se possibile. Gli utenti possono Consenti ad app specifiche di usare l'utilizzo dei dati misurati in background anche quando Il risparmio è attivo.

Android 7.0 (livello API 24) estende la ConnectivityManager API per fornire alle app un modo per recuperare i dati dell'utente Preferenze di risparmio e monitoraggio preferenze modifiche. È considerata buona prassi per le app controllare se l'utente ha attivato Risparmio dati e tentiamo di limitare i contenuti in primo piano e l'utilizzo dei dati in background.

Controllare le preferenze di Risparmio dati

Su Android 7.0 (livello API 24) e versioni successive, le app possono utilizzare API ConnectivityManager per stabilire quali restrizioni all'uso dei dati vengono applicate. La getRestrictBackgroundStatus() restituisce uno dei seguenti valori:

RESTRICT_BACKGROUND_STATUS_DISABLED
La funzionalità Risparmio dati è disattivata.
RESTRICT_BACKGROUND_STATUS_ENABLED
L'utente ha attivato Risparmio dati per questa app. Le app dovrebbero cercare di limitare i dati utilizzo in primo piano e gestire agevolmente le limitazioni in background l'utilizzo dei dati.
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 è attiva la modalità Risparmio dati disattivato o l'app può ignorarlo. Il seguente codice campione utilizza ConnectivityManager.isActiveNetworkMetered() e ConnectivityManager.getRestrictBackgroundStatus() per determinare la quantità di dati 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 ne limita solo la limitazione. Quando la in primo piano, le applicazioni hanno un limite di 800 Kbps e quando in background per le applicazioni sono limitati a 10 Kbps. Utilizza le funzionalità di ConnectivityManager.isActiveNetworkMetered() per rilevare quando limitare l'utilizzo dei dati sulla TV.

Richiedi autorizzazioni di limitazione dei dati

Se la tua app ha bisogno di utilizzare dati in background, può richiedere dati autorizzazioni di limitazione tramite l'invio di Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS intent 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 Settings e visualizza le impostazioni di utilizzo dei dati per la tua app. L'utente può quindi decidere se per attivare i dati in background per la tua app. Prima di inviare questo intent, è buona norma chiedere prima all'utente se vuole avviare L'app Impostazioni per attivare i dati in background. all'utilizzo delle risorse.

Monitorare le modifiche alle preferenze di Risparmio dati

Le app possono monitorare le modifiche alle preferenze di Risparmio dati creando un'opzione Da BroadcastReceiver a ascolta ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED e in modo dinamico la registrazione del ricevitore Context.registerReceiver(). Quando un'app riceve questo annuncio, dovrebbe controllare se la nuova funzione Risparmio dati ne dipendono le autorizzazioni, richiamando 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 li riceveranno.

Esegui test con i comandi Android Debug Bridge

Android Debug Bridge (ADB) fornisce alcuni comandi che puoi usare per testare la tua app in Risparmio dati le condizioni di traffico. Puoi controllare e configurare la rete autorizzazioni o imposta le reti wireless come a consumo per testare l'app con il reti.

$ adb shell dumpsys netpolicy
Genera un report che include la rete di sfondo globale corrente limitazione, gli UID dei pacchetti attualmente autorizzati a ignorare la funzionalità Risparmio dati e autorizzazioni di rete per 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 durante il trasferimento di true o rispettivamente false.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Aggiunge l'UID pacchetto specificato alla lista consentita (whitelist) per consentire l'utilizzo in background dell'utilizzo dei dati a consumo.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Rimuove l'UID pacchetto specificato dalla lista consentita (whitelist) da bloccare utilizzo dei dati a consumo in background quando è attivo Risparmio dati.
$ adb shell cmd netpolicy list wifi-networks
Elenca tutte le reti Wi-Fi e mostra 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, in modo da simulare un una rete a consumo su una rete unmetered.