Register now for Android Dev Summit 2019!

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 el Ahorro de datos en todo el dispositivo para optimizar y reducir el uso de datos del dispositivo. Esta capacidad es particularmente útil en el modo de itinerancia, cerca del final del ciclo de facturación o para un pequeño paquete prepago de datos.

Cuando un usuario habilita el Ahorro de datos en Settings y el dispositivo está conectado a una red de uso medido, el sistema bloquea el uso de datos en segundo plano y envía señales a las apps para 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 el ahorro de datos.

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

Verificación de las preferencias del Ahorro de datos

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

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

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

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 lista blanca

Si la app necesita utilizar datos en segundo plano, esta puede solicitar permisos de lista blanca mediante el envío de un intent Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS que contenga un URI del nombre de paquete de la app, como package:MY_APP_ID.

Mediante el envío del intent y el URI, se inicia la app de Settings y se muestra la configuración de uso de datos de la app. El usuario luego puede decidir si habilita los datos en segundo plano para tu app. Antes de enviar este intent, primero consúltale al usuario si desea iniciar la app de Settings con el objetivo de habilitar el uso de datos en segundo plano.

Cómo controlar cambios en las preferencias del Ahorro de datos

Las apps pueden controlar los cambios en las preferencias del Ahorro de datos mediante la creación de un BroadcastReceiver para escuchar ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED y mediante un registro dinámico del receptor con Context.registerReceiver(). Cuando una app recibe esta transmisión, debe verificar si las nuevas preferencias del Ahorro de datos afectan los permisos. Para ello, debe invocar a ConnectivityManager.getRestrictBackgroundStatus().

Nota: El sistema únicamente envía esta transmisión a las apps que se registran de manera dinámica para recibirla con Context.registerReceiver(). Las apps que están registradas para recibir esta transmisión en su manifiesto no la recibirán.

Cómo probar comandos de Android Debug Bridge

Android Debug Bridge (ADB) ofrece algunos comandos que puedes usar para probar tu app en condiciones del Ahorro de datos. Puedes revisar y configurar los permisos de red o establecer redes inalámbricas medidas para probar tu app en redes no medidas.

$ 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 de Network Policy Manager (políticas de red).
$ adb shell cmd netpolicy set restrict-background <boolean>
Se habilita o inhabilita el Ahorro de datos cuando se asignan los valores 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 de datos medidos 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 de datos medidos en segundo plano mientras el Ahorro de datos está habilitado.
$ adb shell cmd netpolicy list wifi-networks
Enumera todas las redes Wi-Fi e indica si son medidas.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Establece la conexión Wi-Fi con el SSID especificado medido, lo que te permite simular una red medida en una red no medida.