Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

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 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 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 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
Ahorro de datos está inhabilitado.
RESTRICT_BACKGROUND_STATUS_ENABLED
El usuario habilitó Ahorro de datos para esta app. Las apps deberían esforzarse por limitar el uso de datos en primer plano y manejar con facilidad las restricciones de 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 ejemplo de código se usan ConnectivityManager.isActiveNetworkMetered() y ConnectivityManager.getRestrictBackgroundStatus() para determinar la cantidad de datos que la app debe utilizar:

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

Al enviar el intent y el URI, se inicia la app de Configuración y se muestra la configuración del uso de datos de tu app. Luego, el usuario puede decidir si quiere habilitar los datos en segundo plano para tu app. Antes de enviar este intent, consúltale al usuario si desea iniciar la app de Configuración con el objetivo de habilitar el uso de datos en segundo plano.

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

Las apps pueden controlar los cambios en las preferencias de 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 llamar a ConnectivityManager.getRestrictBackgroundStatus().

Nota: El sistema solamente envía esta emisión a las apps que se registran de forma dinámica con 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 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 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 permite simular una red de uso medido en una que no lo es.