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>