page.title=Ahorro de datos metaDescription=User-enabled data usage optimization. page.keywords="android N", "data usage", "metered network" page.image=images/cards/card-nyc_2x.jpg @jd:body <div id="qv-wrapper"> <div id="qv"> <h2> En este documento </h2> <ol> <li> <a href="#status">Verificación de las preferencias de ahorro de datos</a> <ol> <li> <a href="#request-whitelist">Solicitud de permisos de lista blanca</a> </li> </ol> </li> <li> <a href="#monitor-changes">Control de cambios en las preferencias de ahorro de datos</a> </li> <li> <a href="#testing">Pruebas con comandos de Android Debug Bridge</a> </li> </ol> </div> </div> <p> 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. En la versión N Developer Preview, los usuarios pueden habilitar el ahorro de datos en todo el dispositivo a fin de reducir el uso de datos, ya sea con servicio de itinerancia, cerca del final del ciclo de facturación o con un pequeño paquete de datos prepago. </p> <p> Cuando un usuario habilita el ahorro de datos en <strong>Settings</strong> 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 aplicaciones para que utilicen menos datos en primer plano siempre que sea posible. Los usuarios pueden incluir aplicaciones específicas en la lista blanca para permitir el uso de datos medidos en segundo plano, incluso cuando está activado el ahorro de datos. </p> <p> La N Developer Preview extiende la API {@link android.net.ConnectivityManager} para que las aplicaciones puedan <a href="#status">recuperar las preferencias de ahorro de datos del usuario</a> y <a href="#monitor-changes">controlar los cambios en las preferencias</a>. Se considera una buena práctica que las aplicaciones verifiquen si el usuario habilitó el ahorro de datos y se esfuercen por reducir el uso de datos en primer y segundo plano. </p> <h2 id="status"> Verificación de las preferencias de ahorro de datos </h2> <p> En la N Developer Preview, las aplicaciones pueden utilizar la API {@link android.net.ConnectivityManager} para determinar qué restricciones de uso de datos se aplican. Mediante el método {@code getRestrictBackgroundStatus()} , se devuelve uno de los siguientes valores: </p> <dl> <dt> {@code RESTRICT_BACKGROUND_STATUS_DISABLED} </dt> <dd> El ahorro de datos está inhabilitado. </dd> <dt> {@code RESTRICT_BACKGROUND_STATUS_ENABLED} </dt> <dd> El usuario habilitó el ahorro de datos para esta aplicación. Las aplicaciones deben esforzarse por reducir el uso de datos en primer plano y manejar correctamente las restricciones para el uso de datos en segundo plano. </dd> <dt> {@code RESTRICT_BACKGROUND_STATUS_WHITELISTED} </dt> <dd> El usuario habilitó el ahorro de datos, pero la aplicación se encuentra en la lista blanca. Las aplicaciones aún deben esforzarse por reducir el uso de datos en primer y segundo plano. </dd> </dl> <p> 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á deshabilitado o la aplicación se encuentra en la lista blanca. El siguiente código de muestra utiliza {@link android.net.ConnectivityManager#isActiveNetworkMetered ConnectivityManager.isActiveNetworkMetered()} y {@code ConnectivityManager.getRestrictBackgroundStatus()} para determinar la cantidad de datos que la aplicación debe utilizar: </p> <pre> 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. } </pre> <h3 id="request-whitelist"> Solicitud de permisos de lista blanca </h3> <p> Si la aplicación necesita utilizar datos en segundo plano, esta puede solicitar permisos de lista blanca mediante el envío de una intent <code>Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS</code> que contenga un URI del nombre de paquete de la aplicación, como por ejemplo, <code>package:MY_APP_ID</code>. </p> <p> Mediante el envío de la intent y el URI, se inicia la aplicación <strong>Settings</strong> y se muestra la configuración de uso de datos para la aplicación. El usuario luego puede decidir si habilita los datos en segundo plano para la aplicación. Antes de enviar esta intent, resulta buena práctica consultarle primero al usuario acerca de si desea iniciar la aplicación <strong>Settings</strong> con el objetivo de habilitar el uso de datos en segundo plano. </p> <h2 id="monitor-changes"> Control de cambios en las preferencias de ahorro de datos </h2> <p> Las aplicaciones pueden controlar los cambios en las preferencias de ahorro de datos mediante la creación de un {@link android.content.BroadcastReceiver} para escuchar {@code ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED} y mediante un registro dinámico del receptor con {@link android.content.Context#registerReceiver Context.registerReceiver()}. Cuando una aplicación recibe esta transmisión, debe <a href="#status">verificar si las nuevas preferencias de ahorro de datos afectan los permisos; para ello,</a> la aplicación debe llamar a {@code ConnectivityManager.getRestrictBackgroundStatus()}. </p> <p class="note"> <strong>Nota:</strong> El sistema únicamente envía esta transmisión a las aplicaciones que se registran dinámicamente para recibirla con {@link android.content.Context#registerReceiver Context.registerReceiver()}. Las aplicaciones que en su manifiesto registran que la reciben no la recibirán. </p> <h2 id="testing"> Pruebas con comandos de Android Debug Bridge </h2> <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> ofrece algunos comandos que puedes utilizar para verificar y configurar los permisos de red: <dl> <dt> <code>$ adb shell dumpsys netpolicy</code> </dt> <dd> 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. </dd> <dt> <code>$ adb shell cmd netpolicy</code> </dt> <dd> Se muestra una lista completa de los comandos del administrador de políticas de red (políticas de red). </dd> <dt> <code>$ adb shell cmd netpolicy set restrict-background <boolean></code> </dt> <dd> Se habilita o deshabilita el modo de ahorro de datos cuando se asignan los valores <code>true</code> o <code>false</code>, respectivamente. </dd> <dt> <code>$ adb shell cmd netpolicy add restrict-background-whitelist <UID></code> </dt> <dd> Se agrega el UID del paquete específico a la lista blanca para permitir el uso de datos medidos en segundo plano. </dd> <dt> <code>$ adb shell cmd netpolicy remove restrict-background-whitelist <UID></code> </dt> <dd> 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. </dd> </dl>