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
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.
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 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.
La N Developer Preview extiende la API {@link android.net.ConnectivityManager} para que las aplicaciones puedan recuperar las preferencias de ahorro de datos del usuario y controlar los cambios en las preferencias. 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.
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:
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:
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. }
Si la aplicación necesita utilizar datos en segundo plano, esta puede solicitar permisos de
lista blanca mediante el envío de una intent
Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS
que contenga un URI del nombre de paquete de la aplicación, como por ejemplo,
package:MY_APP_ID
.
Mediante el envío de la intent y el URI, se inicia la aplicación Settings 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 Settings con el objetivo de habilitar el uso de datos en segundo plano.
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 verificar si las nuevas preferencias de ahorro de datos afectan los permisos; para ello, la aplicación debe llamar a {@code ConnectivityManager.getRestrictBackgroundStatus()}.
Nota: 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.
$ adb shell dumpsys netpolicy
$ adb shell cmd netpolicy
$ adb shell cmd netpolicy set restrict-background
<boolean>
true
o
false
, respectivamente.
$ adb shell cmd netpolicy add restrict-background-whitelist
<UID>
$ adb shell cmd netpolicy remove restrict-background-whitelist
<UID>