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
    &lt;boolean&gt;</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
    &lt;UID&gt;</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
    &lt;UID&gt;</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>