blob: ff0635ebe10c51716c0d7c3bf4f6a7c3313f9094 [file] [log] [blame]
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>