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