page.title=Notificaciones
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png

trainingnavtop=true

@jd:body

<div id="qv-wrapper">
<div id="qv">

<!-- table of contents -->
<h2>Este documento incluye lo siguiente:</h2>
<ol>
  <li><a href="#direct">Respuesta directa</a></li>
  <li><a href="#bundle">Notificaciones integradas</a></li>
  <li><a href="#custom">Vistas personalizadas</a></li>
  <li><a href="#style">Estilo de mensajería</a></li>
</ol>

</div>
</div>

<p>Android N presenta varias API nuevas que permiten a las aplicaciones publicar
notificaciones altamente visibles e interactivas.</p>

<p>Android N amplía la API de notificación existente {@link android.support.v4.app.RemoteInput}
para admitir respuestas en línea en teléfonos celulares. Esta función permite a los usuarios
 responder rápidamente desde el panel de notificaciones sin tener que visitar tu aplicación.</p>

<p>
  Android N también te permite agrupar notificaciones similares para que
  aparezcan como una sola notificación. Para que esto sea posible, Android N usa el método existente {@link
  android.support.v4.app.NotificationCompat.Builder#setGroup
  NotificationCompat.Builder.setGroup()}. Los usuarios pueden expandir cada una de las
  notificaciones y realizar acciones como responder e ignorar en cada una
  de ellas, de forma individual desde el panel de notificaciones.
</p>

<p>Por último, Android N también suma nuevas API que te permiten aprovechar las decoraciones
del sistema en las vistas de notificación personalizadas de tu aplicación. Estas API ayudan a
garantizar que las vistas de notificaciones compartan una presentación acorde a las
plantillas estándar.</p>

<p>En este documento se destacan algunos de los cambios clave que puedes tener en cuenta
 al usar las nuevas funciones de notificación en tus aplicaciones.</p>

<h2 id="direct">Respuesta directa</h2>

<p>Con la función de respuesta directa en Android N, los usuarios pueden responder
rápidamente mensajes de texto o actualizar listas de tareas directamente dentro de la interfaz de
notificación. En un dispositivo portátil, la acción de respuesta en línea aparece como un botón adicional
 anexado a la notificación. Cuando un usuario responde mediante el teclado, el sistema adjunta
 la respuesta de texto a la intent
 que especificaste para la acción de notificación y envía la intención a tu
 aplicación para dispositivos portátiles.


<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
  {@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
  <strong>Figura 1.</strong> Android N agrega el botón de acción <strong>Reply</strong>
.
</p>

<h3>Adición de acciones de respuesta en línea</h3>

<p>Para crear una acción de notificación que admita respuesta directa:
</p>

<ol>
<li>Crea una instancia de {@link android.support.v4.app.RemoteInput.Builder}
  que puedas agregar a tu acción de
notificación. El constructor de esta clase acepta una cadena que el sistema usa como clave
 para la inserción de texto. Luego, tu aplicación para dispositivos portátiles usará esa clave para recuperar el texto
  de la entrada.

<pre>
// Key for the string that's delivered in the action's intent.
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
        .setLabel(replyLabel)
        .build();
</pre>
</li>
<li>Adjunta el objeto {@link android.support.v4.app.RemoteInput}
 a una acción usando <code>addRemoteInput()</code>.

<pre>
// Create the reply action and add the remote input.
Notification.Action action =
        new Notification.Action.Builder(R.drawable.ic_reply_icon,
                getString(R.string.label), replyPendingIntent)
                .addRemoteInput(remoteInput)
                .build();
</pre>
</li>

<li>Aplica la acción a una notificación y emite la notificación.

<pre>
// Build the notification and add the action.
Notification newMessageNotification =
        new Notification.Builder(mContext)
                .setSmallIcon(R.drawable.ic_message)
                .setContentTitle(getString(R.string.title))
                .setContentText(getString(R.string.content))
                .addAction(action))
                .build();

// Issue the notification.
NotificationManager notificationManager =
        NotificationManager.from(mContext);
notificationManager.notify(notificationId, newMessageNotification);

</pre>
</li>

</ol>


<p> Cuando se active la acción de notificación,
el sistema le solicitará al usuario que ingrese una respuesta. </p>

<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
    {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
  <strong>Figura 2.</strong> El usuario ingresa texto desde el panel de notificaciones.
</p>

<h3>
  Recuperación de entradas del usuario a partir de la respuesta en línea
</h3>

<p>
  Para recibir entradas del usuario de la interfaz de notificación a la actividad que
 declaraste en la intent de la acción de respuesta:
</p>

<ol>
  <li>Llama a {@link android.support.v4.app.RemoteInput#getResultsFromIntent
  getResultsFromIntent()} pasando la intent de la acción de notificación como
 el parámetro de entrada. Este método devuelve un {@link android.os.Bundle} que
 contiene la respuesta de texto.

    <pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
  </li>

  <li>Consulta el paquete con la clave de resultado (proporcionada al constructor {@link
  android.support.v4.app.RemoteInput.Builder}). Puedes completar
 este proceso y recuperar el texto de entrada mediante la creación de un método, como en el
 siguiente fragmento de código:

    <pre>
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.

private CharSequence getMessageText(Intent intent) {
    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
    if (remoteInput != null) {
        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
    }
    return null;
 }
</pre>
  </li>

  <li>Crea y emite otra notificación, utilizando la misma ID de notificación que
 proporcionaste para la notificación anterior. El indicador de progreso
 desaparece de la interfaz de notificación para informarles a los usuarios que la respuesta
 fue exitosa. Al trabajar con esta nueva notificación, usa el contexto que se
 pasa al método {@code onReceive()} del receptor.

    <pre>
// Build a new notification, which informs the user that the system
// handled their interaction with the previous notification.
Notification repliedNotification =
        new Notification.Builder(context)
                .setSmallIcon(R.drawable.ic_message)
                .setContentText(getString(R.string.replied))
                .build();

// Issue the new notification.
NotificationManager notificationManager =
        NotificationManager.from(context);
notificationManager.notify(notificationId, repliedNotification);
</pre>
  </li>
</ol>

<p>
  En el caso de las aplicaciones interactivas, como los chats, podría ser útil incluir 
 contexto adicional cuando se administra texto recuperado. Por ejemplo, en estas aplicaciones, se podrían mostrar
 múltiples líneas de historial de chat. Cuando el usuario responde a través de {@link
  android.support.v4.app.RemoteInput}, puedes actualizar el historial de respuestas
 por medio del método {@code setRemoteInputHistory()}.
</p>

<p>
  La notificación se debe actualizar o cancelar luego de que la aplicación haya
 recibido entradas remotas. Cuando el usuario responde a una actualización remota
 por medio de la respuesta directa,
 no canceles la notificación. En cambio, actualiza la notificación para mostrar la respuesta del usuario.
En el caso de las notificaciones que utilizan {@code MessagingStyle}, debes agregar
la respuesta como el mensaje más reciente. Cuando se utilizan otras plantillas, puedes
agregar la respuesta del usuario al historial de entradas remotas.
</p>

<h2 id="bundle">Notificaciones integradas</h2>

<p>Android N ofrece a los desarrolladores una nueva manera de representar
 una cola de notificaciones: <i>notificaciones integradas</i>. Esto es similar a la función
  <a href="{@docRoot}training/wearables/notifications/stacks.html">Pilas de
  notificaciones</a> en Android Wear. Por ejemplo, si tu aplicación crea notificaciones
  para los mensajes recibidos, cuando se recibe más de un mensaje, agrupa las
 notificaciones en un solo paquete. Puedes
 usar el método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()} para agrupar notificaciones similares.</p>

<p>
  El grupo de notificaciones impone una jerarquía en las notificaciones que lo integran.
  En la parte superior de esa jerarquía se encuentra una notificación principal que muestra información
  resumida para el grupo. El usuario puede expandir
  progresivamente el grupo de notificaciones, y el sistema muestra más información a medida que el
  usuario continúa indagando. Cuando el usuario expande el paquete, el sistema revela más
  información para todas sus notificaciones secundarias; cuando el usuario
  expande una de esas notificaciones, el sistema revela todo su contenido.
</p>

<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
          {@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
  <strong>Figura 3.</strong> El usuario puede expandir progresivamente el grupo de
 notificaciones.
</p>

<p class="note">
  <strong>Nota:</strong> Si la misma aplicación envía cuatro o más notificaciones
 y no se especifica un grupo, el
 sistema las agrupa automáticamente.
</p>

<p>Para obtener información acerca de cómo agregar notificaciones a un grupo, consulta
<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Agregar
cada notificación a un grupo</a>.</p>


<h3 id="best-practices">Prácticas recomendadas para las notificaciones integradas</h3>
<p>Esta sección proporciona pautas acerca de cuándo usar grupos de notificaciones en lugar
de las notificaciones {@link android.app.Notification.InboxStyle InboxStyle}
que estaban disponibles en versiones anteriores de la
plataforma Android.</p>

<h3>Cuándo usar notificaciones integradas</h3>

<p>Solo debes usar grupos de notificaciones si se cumplen todas las siguientes condiciones
para tu caso de uso:</p>

<ul>
  <li>Las notificaciones secundarias son notificaciones completas y se pueden mostrar
   individualmente sin la necesidad de un resumen del grupo.</li>
  <li>El aislamiento de notificaciones secundarias de forma individual tiene un beneficio. Por
  ejemplo:
  </li>
  <ul>
    <li>Son interactivas, con acciones específicas para cada notificación secundaria.</li>
    <li>Hay más información sobre la notificación secundaria que el usuario quiere leer.</li>
  </ul>
</ul>

<p>Algunos ejemplos de buenos casos de uso para grupos de notificaciones incluyen: una aplicación de mensajería
que exhiba una lista de mensajes entrantes, o una aplicación de correo electrónico que exhiba una lista de
correos electrónicos recibidos.</p>

<p>
Algunos ejemplos de casos en los que se prefiere una sola notificación
 incluyen mensajes individuales de una sola persona, o una lista de
 elementos de texto de una sola línea. Para lograr esto, puedes usar
({@link android.app.Notification.InboxStyle InboxStyle} o
{@link android.app.Notification.BigTextStyle BigTextStyle})
.
</p>

<h3 id ="post">Visualización de notificaciones integradas</h3>

<p>
  La aplicación siempre debe publicar un resumen del grupo, aún si el grupo contiene una sola
 notificación secundaria. Si contiene una sola notificación, el sistema suprimirá el resumen y mostrará directamente la
  notificación secundaria. Esto garantiza
  que el sistema pueda proporcionar una experiencia uniforme cuando el usuario quita con un gesto de "deslizar" notificaciones
  secundarias de un grupo.
</p>

<p class="note">
  <strong>Nota:</strong> Esta versión de Android N aún no
  suprime el resumen para los grupos de notificaciones que contienen una sola notificación secundaria. Esta
  funcionalidad se agregará en una versión posterior de Android N.
</p>

<h3>Inspección de notificaciones</h3>

<p>Si bien el sistema generalmente muestra las notificaciones secundarias como un grupo, puedes configurarlas
 para que aparezcan temporalmente como
 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
 notificaciones emergentes</a>. Esta función es especialmente útil porque permite
  el acceso inmediato a la notificación secundaria más reciente y a las acciones asociadas a ella.
</p>


<h3>Compatibilidad con versiones anteriores</h3>

<p>
  Tanto los grupos de notificaciones como las entradas remotas han formado parte de la API {@link
  android.app.Notification} desde Android 5.0 (API nivel 21) para soportar dispositivos
  con Android Wear. Si ya compilaste notificaciones con esas API,
  lo único que debes hacer es verificar que el comportamiento de la aplicación concuerde
  las pautas antes descritas y considerar la implementación de {@code
  setRemoteInputHistory()}.
</p>

<p>
  Para poder ser compatible con versiones anteriores, están disponibles las mismas API con
  la clase {@link android.support.v4.app.NotificationCompat}
  de la biblioteca de soporte, que te permite crear notificaciones que funcionan en versiones de Android
  anteriores. En dispositivos portátiles y tablets, los usuarios solo ven la notificación de resumen
  de modo que una aplicación aún debe tener un estilo de bandeja de entrada o una notificación equivalente
  que represente todo el contenido del grupo. Dado que los dispositivos con Android
  Wear permiten a los usuarios ver todas las notificaciones secundarias incluso en
  niveles anteriores de la plataforma, debes crear notificaciones secundarias independientemente del nivel de
  API.
</p>

<h2 id="custom"> Vistas personalizadas</h2>
<p>A partir de la versión Android N, puedes personalizar vistas de notificaciones y
aún obtener decoraciones del sistema, como encabezados de notificaciones, acciones y diseños
expandibles.</p>

<p>Para habilitar esta característica, Android N suma las siguientes API para que puedas diseñar tu
  vista personalizada:</p>

<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> Permite diseñar notificaciones que no sean notificaciones
de medios.</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> Permite diseñar notificaciones de medios.</dd>
</dl>

<p>Para usar esta nueva API, llama al método {@code setStyle()} y pásale
el estilo de la vista personalizada que hayas elegido.</p>

<p>Este fragmento muestra cómo crear un objeto de notificación personalizada con el método
{@code DecoratedCustomViewStyle()}.</p>

<pre>
Notification notification = new Notification.Builder()
           .setSmallIcon(R.drawable.ic_stat_player)
           .setLargeIcon(albumArtBitmap))
           .setCustomContentView(contentView);
           .setStyle(new Notification.DecoratedCustomViewStyle())
           .build();

</pre>

<h2 id="style">Estilo de mensajería</h2>
<p>
  Android N presenta una nueva API para personalizar el estilo de una notificación.
  Por medio de la clase <code>MessageStyle</code>, puedes modificar varias de las
 etiquetas que aparecen en la notificación, incluidos el título de la conversación,
 mensajes adicionales y la vista de contenido para la notificación.
</p>

<p>
  El siguiente fragmento de código demuestra cómo personalizar el estilo
 de una notificación mediante la clase <code>MessageStyle</code>.
</p>

<pre>
  Notification notification = new Notification.Builder()
             .setStyle(new Notification.MessagingStyle("Me")
                 .setConversationTitle("Team lunch")
                 .addMessage("Hi", timestamp1, null) // Pass in null for user.
                 .addMessage("What's up?", timestamp2, "Coworker")
                 .addMessage("Not much", timestamp3, null)
                 .addMessage("How about lunch?", timestamp4, "Coworker"));
</pre>