1page.title=Notificaciones 2page.tags=notifications 3helpoutsWidget=true 4page.image=/preview/images/notifications-card.png 5 6trainingnavtop=true 7 8@jd:body 9 10<div id="qv-wrapper"> 11<div id="qv"> 12 13<!-- table of contents --> 14<h2>Este documento incluye lo siguiente:</h2> 15<ol> 16 <li><a href="#direct">Respuesta directa</a></li> 17 <li><a href="#bundle">Notificaciones integradas</a></li> 18 <li><a href="#custom">Vistas personalizadas</a></li> 19 <li><a href="#style">Estilo de mensajería</a></li> 20</ol> 21 22</div> 23</div> 24 25<p>Android N presenta varias API nuevas que permiten a las aplicaciones publicar 26notificaciones altamente visibles e interactivas.</p> 27 28<p>Android N amplía la API de notificación existente {@link android.support.v4.app.RemoteInput} 29para admitir respuestas en línea en teléfonos celulares. Esta función permite a los usuarios 30 responder rápidamente desde el panel de notificaciones sin tener que visitar tu aplicación.</p> 31 32<p> 33 Android N también te permite agrupar notificaciones similares para que 34 aparezcan como una sola notificación. Para que esto sea posible, Android N usa el método existente {@link 35 android.support.v4.app.NotificationCompat.Builder#setGroup 36 NotificationCompat.Builder.setGroup()}. Los usuarios pueden expandir cada una de las 37 notificaciones y realizar acciones como responder e ignorar en cada una 38 de ellas, de forma individual desde el panel de notificaciones. 39</p> 40 41<p>Por último, Android N también suma nuevas API que te permiten aprovechar las decoraciones 42del sistema en las vistas de notificación personalizadas de tu aplicación. Estas API ayudan a 43garantizar que las vistas de notificaciones compartan una presentación acorde a las 44plantillas estándar.</p> 45 46<p>En este documento se destacan algunos de los cambios clave que puedes tener en cuenta 47 al usar las nuevas funciones de notificación en tus aplicaciones.</p> 48 49<h2 id="direct">Respuesta directa</h2> 50 51<p>Con la función de respuesta directa en Android N, los usuarios pueden responder 52rápidamente mensajes de texto o actualizar listas de tareas directamente dentro de la interfaz de 53notificación. En un dispositivo portátil, la acción de respuesta en línea aparece como un botón adicional 54 anexado a la notificación. Cuando un usuario responde mediante el teclado, el sistema adjunta 55 la respuesta de texto a la intent 56 que especificaste para la acción de notificación y envía la intención a tu 57 aplicación para dispositivos portátiles. 58 59 60<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x, 61 {@docRoot}preview/images/inline-reply_2x.png 2x" width="400"> 62<p class="img-caption"> 63 <strong>Figura 1.</strong> Android N agrega el botón de acción <strong>Reply</strong> 64. 65</p> 66 67<h3>Adición de acciones de respuesta en línea</h3> 68 69<p>Para crear una acción de notificación que admita respuesta directa: 70</p> 71 72<ol> 73<li>Crea una instancia de {@link android.support.v4.app.RemoteInput.Builder} 74 que puedas agregar a tu acción de 75notificación. El constructor de esta clase acepta una cadena que el sistema usa como clave 76 para la inserción de texto. Luego, tu aplicación para dispositivos portátiles usará esa clave para recuperar el texto 77 de la entrada. 78 79<pre> 80// Key for the string that's delivered in the action's intent. 81private static final String KEY_TEXT_REPLY = "key_text_reply"; 82String replyLabel = getResources().getString(R.string.reply_label); 83RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) 84 .setLabel(replyLabel) 85 .build(); 86</pre> 87</li> 88<li>Adjunta el objeto {@link android.support.v4.app.RemoteInput} 89 a una acción usando <code>addRemoteInput()</code>. 90 91<pre> 92// Create the reply action and add the remote input. 93Notification.Action action = 94 new Notification.Action.Builder(R.drawable.ic_reply_icon, 95 getString(R.string.label), replyPendingIntent) 96 .addRemoteInput(remoteInput) 97 .build(); 98</pre> 99</li> 100 101<li>Aplica la acción a una notificación y emite la notificación. 102 103<pre> 104// Build the notification and add the action. 105Notification newMessageNotification = 106 new Notification.Builder(mContext) 107 .setSmallIcon(R.drawable.ic_message) 108 .setContentTitle(getString(R.string.title)) 109 .setContentText(getString(R.string.content)) 110 .addAction(action)) 111 .build(); 112 113// Issue the notification. 114NotificationManager notificationManager = 115 NotificationManager.from(mContext); 116notificationManager.notify(notificationId, newMessageNotification); 117 118</pre> 119</li> 120 121</ol> 122 123 124<p> Cuando se active la acción de notificación, 125el sistema le solicitará al usuario que ingrese una respuesta. </p> 126 127<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x, 128 {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300"> 129<p class="img-caption"> 130 <strong>Figura 2.</strong> El usuario ingresa texto desde el panel de notificaciones. 131</p> 132 133<h3> 134 Recuperación de entradas del usuario a partir de la respuesta en línea 135</h3> 136 137<p> 138 Para recibir entradas del usuario de la interfaz de notificación a la actividad que 139 declaraste en la intent de la acción de respuesta: 140</p> 141 142<ol> 143 <li>Llama a {@link android.support.v4.app.RemoteInput#getResultsFromIntent 144 getResultsFromIntent()} pasando la intent de la acción de notificación como 145 el parámetro de entrada. Este método devuelve un {@link android.os.Bundle} que 146 contiene la respuesta de texto. 147 148 <pre> 149Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); 150</pre> 151 </li> 152 153 <li>Consulta el paquete con la clave de resultado (proporcionada al constructor {@link 154 android.support.v4.app.RemoteInput.Builder}). Puedes completar 155 este proceso y recuperar el texto de entrada mediante la creación de un método, como en el 156 siguiente fragmento de código: 157 158 <pre> 159// Obtain the intent that started this activity by calling 160// Activity.getIntent() and pass it into this method to 161// get the associated string. 162 163private CharSequence getMessageText(Intent intent) { 164 Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); 165 if (remoteInput != null) { 166 return remoteInput.getCharSequence(KEY_TEXT_REPLY); 167 } 168 return null; 169 } 170</pre> 171 </li> 172 173 <li>Crea y emite otra notificación, utilizando la misma ID de notificación que 174 proporcionaste para la notificación anterior. El indicador de progreso 175 desaparece de la interfaz de notificación para informarles a los usuarios que la respuesta 176 fue exitosa. Al trabajar con esta nueva notificación, usa el contexto que se 177 pasa al método {@code onReceive()} del receptor. 178 179 <pre> 180// Build a new notification, which informs the user that the system 181// handled their interaction with the previous notification. 182Notification repliedNotification = 183 new Notification.Builder(context) 184 .setSmallIcon(R.drawable.ic_message) 185 .setContentText(getString(R.string.replied)) 186 .build(); 187 188// Issue the new notification. 189NotificationManager notificationManager = 190 NotificationManager.from(context); 191notificationManager.notify(notificationId, repliedNotification); 192</pre> 193 </li> 194</ol> 195 196<p> 197 En el caso de las aplicaciones interactivas, como los chats, podría ser útil incluir 198 contexto adicional cuando se administra texto recuperado. Por ejemplo, en estas aplicaciones, se podrían mostrar 199 múltiples líneas de historial de chat. Cuando el usuario responde a través de {@link 200 android.support.v4.app.RemoteInput}, puedes actualizar el historial de respuestas 201 por medio del método {@code setRemoteInputHistory()}. 202</p> 203 204<p> 205 La notificación se debe actualizar o cancelar luego de que la aplicación haya 206 recibido entradas remotas. Cuando el usuario responde a una actualización remota 207 por medio de la respuesta directa, 208 no canceles la notificación. En cambio, actualiza la notificación para mostrar la respuesta del usuario. 209En el caso de las notificaciones que utilizan {@code MessagingStyle}, debes agregar 210la respuesta como el mensaje más reciente. Cuando se utilizan otras plantillas, puedes 211agregar la respuesta del usuario al historial de entradas remotas. 212</p> 213 214<h2 id="bundle">Notificaciones integradas</h2> 215 216<p>Android N ofrece a los desarrolladores una nueva manera de representar 217 una cola de notificaciones: <i>notificaciones integradas</i>. Esto es similar a la función 218 <a href="{@docRoot}training/wearables/notifications/stacks.html">Pilas de 219 notificaciones</a> en Android Wear. Por ejemplo, si tu aplicación crea notificaciones 220 para los mensajes recibidos, cuando se recibe más de un mensaje, agrupa las 221 notificaciones en un solo paquete. Puedes 222 usar el método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup 223Builder.setGroup()} para agrupar notificaciones similares.</p> 224 225<p> 226 El grupo de notificaciones impone una jerarquía en las notificaciones que lo integran. 227 En la parte superior de esa jerarquía se encuentra una notificación principal que muestra información 228 resumida para el grupo. El usuario puede expandir 229 progresivamente el grupo de notificaciones, y el sistema muestra más información a medida que el 230 usuario continúa indagando. Cuando el usuario expande el paquete, el sistema revela más 231 información para todas sus notificaciones secundarias; cuando el usuario 232 expande una de esas notificaciones, el sistema revela todo su contenido. 233</p> 234 235<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x, 236 {@docRoot}preview/images/bundles_2x.png 2x" width="300"> 237<p class="img-caption"> 238 <strong>Figura 3.</strong> El usuario puede expandir progresivamente el grupo de 239 notificaciones. 240</p> 241 242<p class="note"> 243 <strong>Nota:</strong> Si la misma aplicación envía cuatro o más notificaciones 244 y no se especifica un grupo, el 245 sistema las agrupa automáticamente. 246</p> 247 248<p>Para obtener información acerca de cómo agregar notificaciones a un grupo, consulta 249<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Agregar 250cada notificación a un grupo</a>.</p> 251 252 253<h3 id="best-practices">Prácticas recomendadas para las notificaciones integradas</h3> 254<p>Esta sección proporciona pautas acerca de cuándo usar grupos de notificaciones en lugar 255de las notificaciones {@link android.app.Notification.InboxStyle InboxStyle} 256que estaban disponibles en versiones anteriores de la 257plataforma Android.</p> 258 259<h3>Cuándo usar notificaciones integradas</h3> 260 261<p>Solo debes usar grupos de notificaciones si se cumplen todas las siguientes condiciones 262para tu caso de uso:</p> 263 264<ul> 265 <li>Las notificaciones secundarias son notificaciones completas y se pueden mostrar 266 individualmente sin la necesidad de un resumen del grupo.</li> 267 <li>El aislamiento de notificaciones secundarias de forma individual tiene un beneficio. Por 268 ejemplo: 269 </li> 270 <ul> 271 <li>Son interactivas, con acciones específicas para cada notificación secundaria.</li> 272 <li>Hay más información sobre la notificación secundaria que el usuario quiere leer.</li> 273 </ul> 274</ul> 275 276<p>Algunos ejemplos de buenos casos de uso para grupos de notificaciones incluyen: una aplicación de mensajería 277que exhiba una lista de mensajes entrantes, o una aplicación de correo electrónico que exhiba una lista de 278correos electrónicos recibidos.</p> 279 280<p> 281Algunos ejemplos de casos en los que se prefiere una sola notificación 282 incluyen mensajes individuales de una sola persona, o una lista de 283 elementos de texto de una sola línea. Para lograr esto, puedes usar 284({@link android.app.Notification.InboxStyle InboxStyle} o 285{@link android.app.Notification.BigTextStyle BigTextStyle}) 286. 287</p> 288 289<h3 id ="post">Visualización de notificaciones integradas</h3> 290 291<p> 292 La aplicación siempre debe publicar un resumen del grupo, aún si el grupo contiene una sola 293 notificación secundaria. Si contiene una sola notificación, el sistema suprimirá el resumen y mostrará directamente la 294 notificación secundaria. Esto garantiza 295 que el sistema pueda proporcionar una experiencia uniforme cuando el usuario quita con un gesto de "deslizar" notificaciones 296 secundarias de un grupo. 297</p> 298 299<p class="note"> 300 <strong>Nota:</strong> Esta versión de Android N aún no 301 suprime el resumen para los grupos de notificaciones que contienen una sola notificación secundaria. Esta 302 funcionalidad se agregará en una versión posterior de Android N. 303</p> 304 305<h3>Inspección de notificaciones</h3> 306 307<p>Si bien el sistema generalmente muestra las notificaciones secundarias como un grupo, puedes configurarlas 308 para que aparezcan temporalmente como 309 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up"> 310 notificaciones emergentes</a>. Esta función es especialmente útil porque permite 311 el acceso inmediato a la notificación secundaria más reciente y a las acciones asociadas a ella. 312</p> 313 314 315<h3>Compatibilidad con versiones anteriores</h3> 316 317<p> 318 Tanto los grupos de notificaciones como las entradas remotas han formado parte de la API {@link 319 android.app.Notification} desde Android 5.0 (API nivel 21) para soportar dispositivos 320 con Android Wear. Si ya compilaste notificaciones con esas API, 321 lo único que debes hacer es verificar que el comportamiento de la aplicación concuerde 322 las pautas antes descritas y considerar la implementación de {@code 323 setRemoteInputHistory()}. 324</p> 325 326<p> 327 Para poder ser compatible con versiones anteriores, están disponibles las mismas API con 328 la clase {@link android.support.v4.app.NotificationCompat} 329 de la biblioteca de soporte, que te permite crear notificaciones que funcionan en versiones de Android 330 anteriores. En dispositivos portátiles y tablets, los usuarios solo ven la notificación de resumen 331 de modo que una aplicación aún debe tener un estilo de bandeja de entrada o una notificación equivalente 332 que represente todo el contenido del grupo. Dado que los dispositivos con Android 333 Wear permiten a los usuarios ver todas las notificaciones secundarias incluso en 334 niveles anteriores de la plataforma, debes crear notificaciones secundarias independientemente del nivel de 335 API. 336</p> 337 338<h2 id="custom"> Vistas personalizadas</h2> 339<p>A partir de la versión Android N, puedes personalizar vistas de notificaciones y 340aún obtener decoraciones del sistema, como encabezados de notificaciones, acciones y diseños 341expandibles.</p> 342 343<p>Para habilitar esta característica, Android N suma las siguientes API para que puedas diseñar tu 344 vista personalizada:</p> 345 346<dl> 347<dt> 348{@code DecoratedCustomViewStyle()}</dt> 349<dd> Permite diseñar notificaciones que no sean notificaciones 350de medios.</dd> 351<dt> 352{@code DecoratedMediaCustomViewStyle()}</dt> 353<dd> Permite diseñar notificaciones de medios.</dd> 354</dl> 355 356<p>Para usar esta nueva API, llama al método {@code setStyle()} y pásale 357el estilo de la vista personalizada que hayas elegido.</p> 358 359<p>Este fragmento muestra cómo crear un objeto de notificación personalizada con el método 360{@code DecoratedCustomViewStyle()}.</p> 361 362<pre> 363Notification notification = new Notification.Builder() 364 .setSmallIcon(R.drawable.ic_stat_player) 365 .setLargeIcon(albumArtBitmap)) 366 .setCustomContentView(contentView); 367 .setStyle(new Notification.DecoratedCustomViewStyle()) 368 .build(); 369 370</pre> 371 372<h2 id="style">Estilo de mensajería</h2> 373<p> 374 Android N presenta una nueva API para personalizar el estilo de una notificación. 375 Por medio de la clase <code>MessageStyle</code>, puedes modificar varias de las 376 etiquetas que aparecen en la notificación, incluidos el título de la conversación, 377 mensajes adicionales y la vista de contenido para la notificación. 378</p> 379 380<p> 381 El siguiente fragmento de código demuestra cómo personalizar el estilo 382 de una notificación mediante la clase <code>MessageStyle</code>. 383</p> 384 385<pre> 386 Notification notification = new Notification.Builder() 387 .setStyle(new Notification.MessagingStyle("Me") 388 .setConversationTitle("Team lunch") 389 .addMessage("Hi", timestamp1, null) // Pass in null for user. 390 .addMessage("What's up?", timestamp2, "Coworker") 391 .addMessage("Not much", timestamp3, null) 392 .addMessage("How about lunch?", timestamp4, "Coworker")); 393</pre> 394