Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 847b2a4a authored by Andrew Solovay's avatar Andrew Solovay Committed by android-build-merger
Browse files

docs: Removing non-English /preview/ directories

am: 2d629c3e

Change-Id: I499a0148d7ece41b30f83baa34a0efc5c0ec1c82
parents 91416666 2d629c3e
Loading
Loading
Loading
Loading
+0 −360

File deleted.

Preview size limit exceeded, changes collapsed.

+0 −391
Original line number Diff line number Diff line
page.title=Optimizaciones en segundo plano
page.metaDescription=Nuevas restricciones para transmisiones implícitas.
page.keywords="android N", "implicit broadcasts", "job scheduler"
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="#connectivity-action">Restricciones en CONNECTIVITY_ACTION</a>
      </li>

      <li>
        <a href="#sched-jobs">Programación de trabajos en red en conexiones
        sin medición de uso</a>
      </li>

      <li>
        <a href="#monitor-conn">Control de la conectividad de la red mientras la aplicación
        se está ejecutando</a>
      </li>

      <li>
        <a href="#media-broadcasts">Restricciones en NEW_PICTURE y
        NEW_VIDEO</a>
      </li>

      <li>
        <a href="#new-jobinfo">Nuevos métodos de JobInfo</a>
      </li>

      <li>
        <a href="#new-jobparam">Nuevos métodos de JobParameter</a>
      </li>

      <li>
        <a href="#further-optimization">Cómo optimizar aún más tu aplicación</a>
      </li>
    </ol>
  </div>
</div>

<p>
  Los procesos en segundo plano pueden consumir mucha memoria y batería. Por ejemplo, una
  transmisión implícita puede iniciar muchos procesos en segundo plano registrados para
  escucharla, aunque esos procesos quizá no desempeñen un trabajo considerable. Esto puede
 afectar de forma significativa tanto el rendimiento del dispositivo como la experiencia de usuario.
</p>

<p>
  Para corregir este problema, en Android N se aplican las siguientes
 restricciones:
</p>

<ul>
  <li>Las aplicaciones orientadas a la Preview no reciben transmisiones {@link
  android.net.ConnectivityManager#CONNECTIVITY_ACTION} si
 en su manifiesto registran que las reciben. Las aplicaciones que se ejecutan aún pueden
 escuchar {@code CONNECTIVITY_CHANGE} en su subproceso principal mediante el registro de un
 {@link android.content.BroadcastReceiver} con {@link
  android.content.Context#registerReceiver Context.registerReceiver()}.
  </li>

  <li>Las aplicaciones no pueden enviar ni recibir transmisiones {@link
  android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link
  android.hardware.Camera#ACTION_NEW_VIDEO}. Esta optimización
 afecta a todas las aplicaciones, no solo a aquellas orientadas a la Preview.
  </li>
</ul>

<p>
  Si la aplicación utiliza cualquiera de estas intents, debes quitar las dependencias en
 ellas lo antes posible a fin de poder orientar los dispositivos Android N correctamente.
  El framework de Android ofrece varias soluciones para mitigar la necesidad de
  estas transmisiones implícitas. Por ejemplo, {@link android.app.job.JobScheduler}
  y <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
  {@code GcmNetworkManager}</a> proporcionan mecanismos sólidos para programar operaciones
  de red cuando se cumplen las condiciones especificadas, como una conexión a una
  red de uso no medido. Ahora también puedes usar {@link android.app.job.JobScheduler}
  para reaccionar a cambios en relación con los proveedores de contenido. Los objetos {@link android.app.job.JobInfo}
  encapsulan los parámetros que usa {@link android.app.job.JobScheduler}
  para programar el trabajo. Cuando se cumplen las condiciones del trabajo, el sistema
  ejecuta ese trabajo en el {@link android.app.job.JobService} de tu aplicación.
</p>

<p>
  En este documento, aprenderemos cómo usar métodos alternativos, como
  {@link android.app.job.JobScheduler}, para adaptar tu aplicación a esas nuevas
  restricciones.
</p>

<h2 id="connectivity-action">
  Restricciones en CONNECTIVITY_ACTION
</h2>

<p>
  Las aplicaciones orientadas a Android N no reciben transmisiones {@link
  android.net.ConnectivityManager#CONNECTIVITY_ACTION} si en su manifiesto
 registran que las reciben, y los procesos que dependan de esta
 transmisión no se iniciarán. Esto podría ser un problema para aplicaciones que buscan
 escuchar los cambios en la red o realizar múltiples actividades en red cuando el
 dispositivo se conecta a una red sin medición de uso. Ya existen varias soluciones
  en relación con esta restricción en el framework de Android, pero elegir
  la correcta depende de lo que quieras lograr con tu aplicación.
</p>

<p class="note">
  <strong>Nota:</strong> Un {@link android.content.BroadcastReceiver} registrado con
 {@link android.content.Context#registerReceiver Context.registerReceiver()}
 continúa recibiendo estas transmisiones mientras se ejecuta la aplicación.
</p>

<h3 id="sched-jobs">
  Programación de trabajos en red en conexiones sin medición de uso
</h3>

<p>
  Cuando uses la clase {@link android.app.job.JobInfo.Builder JobInfo.Builder}
  para crear tu objeto {@link android.app.job.JobInfo}, aplica el método {@link
  android.app.job.JobInfo.Builder#setRequiredNetworkType
  setRequiredNetworkType()} y pasa {@link android.app.job.JobInfo
  JobInfo.NETWORK_TYPE_UNMETERED} como parámetro de trabajo. El siguiente ejemplo de código
  programa la ejecución de un servicio cuando el dispositivo se conecta a una red sin
  medición de uso y se está cargando:
</p>

<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
  JobScheduler js =
      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
  JobInfo job = new JobInfo.Builder(
    MY_BACKGROUND_JOB,
    new ComponentName(context, MyJobService.class))
      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
      .setRequiresCharging(true)
      .build();
  js.schedule(job);
}
</pre>

<p>
  Cuando se cumplan las condiciones para tu trabajo, tu aplicación recibirá un callback para ejecutar
  el método {@link android.app.job.JobService#onStartJob onStartJob()} en la
   {@code JobService.class} especificada. Para ver más ejemplos de la implementación de {@link
  android.app.job.JobScheduler}, consulta la <a href="{@docRoot}samples/JobScheduler/index.html">aplicación de ejemplo JobScheduler</a>.
</p>

<p>
  Las aplicaciones que usan servicios de GMSCore y están orientadas a Android 5.0 (API nivel 21)
  o anterior, pueden usar <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
  {@code GcmNetworkManager}</a> y especificar {@code Task.NETWORK_STATE_UNMETERED}.
</p>

<h3 id="monitor-conn">
  Control de la conectividad de la red mientras la aplicación se está ejecutando
</h3>

<p>
  Las aplicaciones que se ejecutan aún pueden escuchar {@code CONNECTIVITY_CHANGE} con un
 {@link android.content.BroadcastReceiver} registrado. No obstante, la API {@link
  android.net.ConnectivityManager} ofrece un método más robusto para solicitar
 un callback solo cuando se cumplen las condiciones de red especificadas.
</p>

<p>
  Los objetos {@link android.net.NetworkRequest} definen los parámetros del
  callback de la red en términos de {@link android.net.NetworkCapabilities}. Creas
  objetos {@link android.net.NetworkRequest} con la clase {@link
  android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link
  android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
  android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
  y luego pasa el objeto {@link android.net.NetworkRequest} al sistema. Cuando
  se cumplen las condiciones de la red, la aplicación recibe un callback para ejecutar el método
  {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
  onAvailable()} definido en su clase {@link
  android.net.ConnectivityManager.NetworkCallback}.
</p>

<p>
  La aplicación continuará recibiendo callbacks hasta que la aplicación salga o llame a
  {@link android.net.ConnectivityManager#unregisterNetworkCallback
  unregisterNetworkCallback()}.
</p>

<h2 id="media-broadcasts">
  Restricciones en NEW_PICTURE y NEW_VIDEO
</h2>

<p>
  En Android N, las aplicaciones no pueden enviar ni recibir transmisiones {@link
  android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link
  android.hardware.Camera#ACTION_NEW_VIDEO}. Esta restricción ayuda a
 aliviar el impacto en el rendimiento y la experiencia de usuario cuando varias aplicaciones deben
 activarse para procesar una nueva imagen o video. Android N
 extiende {@link android.app.job.JobInfo} y {@link
  android.app.job.JobParameters} para proporcionar una solución alternativa.
</p>

<h3 id="new-jobinfo">
  Nuevos métodos de JobInfo
</h3>

<p>
  Para activar trabajos en los cambios del URI de contenido, Android N extiende
 la API {@link android.app.job.JobInfo} con los siguientes métodos:
</p>

<dl>
  <dt>
    {@code JobInfo.TriggerContentUri()}
  </dt>

  <dd>
    Encapsula parámetros necesarios para activar un trabajo en cambios del URI de contenido.
  </dd>

  <dt>
    {@code JobInfo.Builder.addTriggerContentUri()}
  </dt>

  <dd>
    Pasa un objeto {@code TriggerContentUri} a {@link
    android.app.job.JobInfo}. Un {@link android.database.ContentObserver}
    controla el URI de contenido encapsulado. Si hay múltiples objetos {@code
    TriggerContentUri} asociados a un trabajo, el sistema proporciona un
    callback aunque se informe un cambio en un solo URI de contenido.
  </dd>

  <dd>
    Si cambia algún desencadenante del URI determinado, agrega el marcador {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} para
    activar el trabajo. Este marcador
    corresponde al parámetro {@code notifyForDescendants} pasado a {@link
    android.content.ContentResolver#registerContentObserver
    registerContentObserver()}.
  </dd>
</dl>

<p class="note">
  <strong>Nota:</strong> No se puede usar {@code TriggerContentUri()} junto
  con {@link android.app.job.JobInfo.Builder#setPeriodic
  setPeriodic()} ni {@link android.app.job.JobInfo.Builder#setPersisted
  setPersisted()}. Para controlar de forma constante la presencia de cambios en el contenido, programa un nuevo
  {@link android.app.job.JobInfo} antes de que el {@link
  android.app.job.JobService} de la aplicación termine de administrar la callback más reciente.
</p>

<p>
  El siguiente código de ejemplo programa la activación de un trabajo cuando el sistema informe
  un cambio en el URI de contenido, {@code MEDIA_URI}:
</p>

<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
  JobScheduler js =
          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
  JobInfo.Builder builder = new JobInfo.Builder(
          MY_BACKGROUND_JOB,
          new ComponentName(context, MediaContentJob.class));
  builder.addTriggerContentUri(
          new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
          JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
  js.schedule(builder.build());
}
</pre>
<p>
  Cuando el sistema informa un cambio en el(los) URI de contenido especificado(s), tu aplicación
  recibe un callback y se pasa un objeto {@link android.app.job.JobParameters}
  al método {@link android.app.job.JobService#onStartJob onStartJob()}
  en {@code MediaContentJob.class}.
</p>

<h3 id="new-jobparam">
  Nuevos métodos de JobParameter
</h3>

<p>
  Android N también amplía {@link android.app.job.JobParameters} para
 permitir que tu aplicación reciba información útil sobre qué autoridades de contenido
 y URI activaron el trabajo:
</p>

<dl>
  <dt>
    {@code Uri[] getTriggeredContentUris()}
  </dt>

  <dd>
    Devuelve el arreglo de los URI que activaron el trabajo. Ese arreglo será {@code
    null} si ningún URI activó el trabajo (por ejemplo, el trabajo
    se activó debido al cumplimiento de un plazo o por otro motivo), o la cantidad de URI
    modificados es superior a 50.
  </dd>

  <dt>
    {@code String[] getTriggeredContentAuthorities()}
  </dt>

  <dd>
    Devuelve el arreglo de cadenas de autoridades de contenido que activaron el trabajo.
    Si el arreglo devuelto no es {@code null}, usa {@code getTriggeredContentUris()}
    para recuperar los detalles de los URI que se modificaron.
  </dd>
</dl>

<p>
  El siguiente código de ejemplo anula el método {@link
  android.app.job.JobService#onStartJob JobService.onStartJob()} y
  registra las autoridades de contenido y los URI que activaron el trabajo:
</p>

<pre>
&#64;Override
public boolean onStartJob(JobParameters params) {
  StringBuilder sb = new StringBuilder();
  sb.append("Media content has changed:\n");
  if (params.getTriggeredContentAuthorities() != null) {
      sb.append("Authorities: ");
      boolean first = true;
      for (String auth :
          params.getTriggeredContentAuthorities()) {
          if (first) {
              first = false;
          } else {
             sb.append(", ");
          }
           sb.append(auth);
      }
      if (params.getTriggeredContentUris() != null) {
          for (Uri uri : params.getTriggeredContentUris()) {
              sb.append("\n");
              sb.append(uri);
          }
      }
  } else {
      sb.append("(No content)");
  }
  Log.i(TAG, sb.toString());
  return true;
}
</pre>

<h2 id="further-optimization">
  Cómo optimizar aún más tu aplicación
</h2>

<p>
  Optimizar tus aplicaciones para que se ejecuten en dispositivos con poca memoria o en condiciones de niveles bajos
  de memoria puede mejorar el rendimiento y la experiencia del usuario. Eliminar
 dependencias en servicios en segundo plano y receptores de transmisiones implícitas
 registrados estadísticamente puede ayudar a que tu aplicación se ejecute mejor en esos dispositivos. Si bien
 Android N toma medidas para reducir algunos de estos problemas, te
 recomendamos que optimices tu aplicación para que pueda ejecutarse sin utilizar esos
 procesos en segundo plano.
</p>

<p>
  Android N presenta algunos comandos adicionales de <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> que
 puedes usar para probar el comportamiento de la aplicación con esos procesos en segundo plano deshabilitados:
</p>

<ul>
  <li>Para simular condiciones en las que no hay transmisiones implícitas ni servicios en segundo plano
 disponibles, ingresa el siguiente comando:
  </li>

  <li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND ignore}
</pre>
  </li>

  <li>Para volver a habilitar las transmisiones implícitas y los servicios en segundo plano, ingresa el
  siguiente comando:
  </li>

  <li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set &lt;package&gt; RUN_IN_BACKGROUND allow}
</pre>
  </li>
</ul>
+0 −159
Original line number Diff line number Diff line
page.title=API de ICU4J en el framework de Android
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="#relation">Relación con ICU4J</a></li>
    <li><a href="#migration">Migración hacia API de android.icu desde ICU4J</a></li>
    <li><a href="#licence">Licencias</a></li>
</ol>

<h2>Consulta también</h2>
<ol>
  <li>
    <a class="external-link" href="http://userguide.icu-project.org">Documentación para ICU4J</a>
  </li>

  <li>
    <a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Últimos estándares compatibles
 con ICU4J</a>
  </li>
</ol>
</div>
</div>

<p>
  ICU4J es un conjunto de bibliotecas de Java de código abierto y amplio uso que brinda soporte de Unicode
 y de globalización para aplicaciones de software. Android N
 expone un subconjunto de las API de ICU4J en el framework de Android para que los desarrolladores de aplicaciones
 lo usen debajo del paquete {@code android.icu}. Estas API usan
 datos de ubicación que están presentes en el dispositivo. Como resultado, puedes reducir la superficie de APK
 evitando la compilación de las bibliotecas de ICU4J en APK. En lugar de esto, puedes
 llamarlas en el framework. (En este caso, posiblemente debas brindar
 <a href="{@docRoot}google/play/publishing/multiple-apks.html">versiones múltiples
 del APK</a>, de modo que los usuarios que usan versiones de Android inferiores a Android N
 puedan descargar una versión de la aplicación que incluya las bibliotecas de ICU4J).
</p>

<p>
  Al principio de este documento, encontrarás información básica sobre el mínimo de niveles de Android API
 necesarios para soportar estas bibliotecas. Más adelante, encontrarás explicaciones sobre qué
 necesitas saber acerca de la implementación de ICU4J específica para Android. Por último,
 encontrarás explicaciones sobre cómo usar las API de ICU4J en el framework de Android.
</p>

<h2 id="relation">Relación con ICU4J</h2>

<p>
  Android N expone un subconjunto de las API de ICU4J mediante el
 paquete <code>android.icu</code>, en lugar de <code>com.ibm.icu</code>. El
framework de Android puede elegir no
 exponer las API de ICU4J por varias razones; por ejemplo, Android N no expone
 algunas API obsoletas o algunas que el equipo de ICU aún no ha declarado como
 estables. A medida que el equipo de ICU deje de usar API en el futuro, Android también las marcará
 como obsoletas, pero las seguirá incluyendo.
</p>

<p class="table-caption"><strong>Tabla 1.</strong> Versiones de ICU y CLDR usadas
 en Android N.</p>
<table>
<tr>
<th>Nivel de Android API</th>
<th>Versión de ICU</th>
<th>Versión de CLDR</th>
</tr>
<tr>
<td>Android N</td>
<td>56</td>
<td>28</td>
</tr>
</table>

<p>Debes tener en cuenta lo siguiente:</p>

<ul>
<li>Las API de ICU4J del framework de Android no incluyen todas las API de ICU4J.</li>
<li>Los desarrolladores de NDK deben saber que ICU4C de Android no es compatible.</li>
<li>Las API del framework de Android no reemplazan la compatibilidad de Android para
<a href="{@docRoot}guide/topics/resources/localization.html">localizar con
recursos</a>.</li>
</ul>

<h2 id="migration">Migración hacia el paquete android.icu desde com.ibm.icu</h2>

<p>
  Si ya estás usando las API de ICU4J en tu aplicación y las
 API de <code>android.icu</code> cumplen con tus requisitos, migrar hacia las
 API del framework implicará que cambies tus importaciones de Java
 de <code>com.ibm.icu</code> a <code>android.icu</code>. Luego, puedes
 quitar tu propia copia de los archivos de ICU4J del APK.
</p>

<p class="note">
  <b>Nota</b>: Las API del framework de ICU4J usan el espacio de nombres {@code android.icu}
 en lugar de {@code com.ibm.icu}. El motivo de esto es evitar conflictos de espacio de nombres
 en APK que contienen sus propias bibliotecas de {@code com.ibm.icu}.
</p>

<h3 id="migrate-from-android">
  Migración hacia API de android.icu desde otras Android SDK API
</h3>

<p>
  Algunas clases de los paquetes de <code>java</code> y de <code>android</code> son
 equivalentes a las clases de ICU4J. Sin embargo, ICU4J a menudo brinda una compatibilidad
 más amplia para estándares e idiomas.
</p>
<p>Aquí tienes algunos ejemplos para comenzar:</p>
<table>
<tr>
<th>Clase</th>
<th>Alternativa</th>
</tr>
<tr>
<td><code>java.lang.Character</code> </td>
<td><code>android.icu.lang.UCharacter</code> </td>
</tr>
<tr>
<td><code>java.text.BreakIterator</code> </td>
<td><code>android.icu.text.BreakIterator</code> </td>
</tr>
<tr>
<td><code>java.text.DecimalFormat</code> </td>
<td><code>android.icu.text.DecimalFormat</code> </td>
</tr>
<tr>
<td><code>java.util.Calendar</code></td>
<td>
<code>android.icu.util.Calendar</code></td>
</tr>
<tr>
<td><code>android.text.BidiFormatter</code>
 </td>
<td><code>android.icu.text.Bidi</code>
 </td>
</tr>
<tr>
<td><code>android.text.format.DateFormat</code>
 </td>
<td><code>android.icu.text.DateFormat</code>
 </td>
</tr>
<tr>
<td><code>android.text.format.DateUtils</code> </td>
<td><code>android.icu.text.DateFormat</code>
<code>android.icu.text.RelativeDateTimeFormatter</code>
</td>
</tr>
</table>

<h2 id="licence">Licencias</h2>

<p>
  ICU4J se presenta bajo la licencia de ICU. Para obtener información más detallada, consulta la <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Guía de usuario
 de ICU.</a>
</p>
+0 −221

File deleted.

Preview size limit exceeded, changes collapsed.

+0 −393

File deleted.

Preview size limit exceeded, changes collapsed.

Loading