Cómo optimizar el uso de datos de red

Durante la vida útil de un smartphone, el costo de un plan de datos móviles puede superar fácilmente el costo del propio dispositivo. A partir de Android 7.0 (nivel de API 24), los usuarios pueden habilitar Ahorro de datos en todo el dispositivo para optimizar el uso de datos y consumir menos. Esta capacidad es particularmente útil cuando se usa el roaming, cerca del final del ciclo de facturación, o bien para un pequeño paquete de datos prepago.

Cuando un usuario habilita Ahorro de datos en la Configuración y el dispositivo está conectado a una red de uso medido, el sistema bloquea el uso de datos en segundo plano y les indica a las apps que usen menos datos en primer plano siempre que sea posible. Los usuarios pueden incluir apps específicas en la lista blanca para permitir el uso de datos medidos en segundo plano, incluso cuando está activado Ahorro de datos.

Android 7.0 (API nivel 24) extiende la API ConnectivityManager para proporcionar a las apps una manera de recuperar las preferencias de Ahorro de datos del usuario y supervisar los cambios en las preferencias. Se considera una práctica recomendada que las apps verifiquen si el usuario habilitó Ahorro de datos y se esfuercen por limitar el uso de datos en primer y segundo plano.

Cómo verificar las preferencias de Ahorro de datos

En Android 7.0 (API nivel 24), las apps pueden usar la API ConnectivityManager para determinar las restricciones de uso de datos que se aplican. El método getRestrictBackgroundStatus() muestra uno de los siguientes valores:

RESTRICT_BACKGROUND_STATUS_DISABLED
Ahorro de datos está inhabilitado.
RESTRICT_BACKGROUND_STATUS_ENABLED
El usuario habilitó Ahorro de datos para esta app. Las apps deben esforzarse por limitar el uso de datos en primer plano y administrar correctamente las restricciones del uso de datos en segundo plano.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
El usuario habilitó Ahorro de datos, pero la app se encuentra en la lista blanca. Igualmente, las apps deben esforzarse por limitar el uso de datos en primer y segundo plano.

Se considera una práctica recomendada limitar el uso de datos siempre que el dispositivo esté conectado a una red de uso medido, incluso si Ahorro de datos está inhabilitado o la app se encuentra en la lista blanca. En el siguiente código de ejemplo, se usan ConnectivityManager.isActiveNetworkMetered() y ConnectivityManager.getRestrictBackgroundStatus() para determinar la cantidad de datos que debe usar la app:

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 whitelisted. 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 whitelisted. 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.
    }
    

Cómo solicitar permisos de la lista blanca

Si tu app necesita usar datos en segundo plano, puede solicitar permisos de la lista blanca enviando un intent Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS que contenga un URI del nombre de paquete de tu app, por ejemplo, package:MY_APP_ID.

Al enviar el intent y el URI, se inicia la app de Configuración y se muestra la configuración de uso de datos de tu app. Luego, el usuario puede decidir si quiere activar los datos en segundo plano para tu app o no. Antes de enviar el intent, te recomendamos que primero le preguntes al usuario si quiere iniciar la app de Configuración a fin de habilitar el uso de datos en segundo plano.

Cómo supervisar los cambios en las preferencias de Ahorro de datos

Las apps pueden supervisar los cambios en las preferencias de Ahorro de datos si crean un BroadcastReceiver para escuchar a ConnectivityManager..ACTION_RESTRICT_BACKGROUND_CHANGED y registrar de forma dinámica el receptor con Context.registerReceiver(). Cuando una app reciba esta emisión, debería verificar si las preferencias de Ahorro de datos afectan sus permisos con un llamado a ConnectivityManager.getRestrictBackgroundStatus().

Nota: El sistema solamente envía esta emisión a las apps que se registran de forma dinámica para recibirlos mediante Context.registerReceiver(). Las apps que se registran para recibir esta emisión en su manifiesto, no la recibirán.

Cómo probar tu app con los comandos de Android Debug Bridge

Android Debug Bridge (ADB) proporciona algunos comandos que puedes usar para probar tu app cuando se activa Ahorro de datos. Puedes verificar y configurar los permisos de red o establecer redes inalámbricas de uso medido para probar tu app en redes de uso no medido.

$ adb shell dumpsys netpolicy
Se genera un informe en el que se incluyen la configuración global actual de restricciones de red en segundo plano, los UID de paquetes que se encuentran actualmente en una lista blanca y los permisos de red de otros paquetes conocidos.
$ adb shell cmd netpolicy
Se muestra una lista completa de los comandos del Administrador de políticas de red (políticas de red).
$ adb shell cmd netpolicy set restrict-background <boolean>
Se habilita o inhabilita el modo de Ahorro de datos cuando se transmite true o false, respectivamente.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Se agrega el UID del paquete específico a la lista blanca para permitir el uso medido de datos en segundo plano.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Se quita el UID del paquete específico de la lista blanca para bloquear el uso medido de datos en segundo plano mientras Ahorro de datos está habilitado.
$ adb shell cmd netpolicy list wifi-networks
Enumera todas las redes Wi-Fi y especifica si son de uso medido o no.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Establece Wi-Fi con el SSID especificado como de uso medido, lo que te permitirá simular una red de uso medido en una que no lo es.