Las burbujas permiten que los usuarios vean las conversaciones y participen en ellas con más facilidad.
Las burbujas están integradas en el sistema de notificaciones. Flotan sobre el contenido de otra app y siguen al usuario adonde mueva el dedo. Las burbujas se pueden expandir para que muestren las funciones y los datos de una app y se pueden contraer cuando no se usan.
Cuando el dispositivo está bloqueado o la pantalla siempre activa está habilitada, las burbujas aparecen del mismo modo que las notificaciones.
Las burbujas se pueden inhabilitar. Cuando aparece la primera en una app, se muestra un diálogo de permisos con dos opciones:
- Bloquear todas las burbujas de tu app: Las notificaciones no se bloquearán, pero nunca aparecerán en formato de burbuja.
- Permitir todos los cuadros de la app: Todas las notificaciones enviadas con
BubbleMetaData
aparecen como cuadros.
La API de burbujas
Las burbujas se crean mediante la API de notificaciones, por lo que envías la notificación como siempre. Si quieres que tu notificación se muestre como una burbuja, debes adjuntarle algunos datos adicionales.
La vista expandida de una burbuja se crea a partir de una actividad que elijas. La actividad se debe configurar para que aparezca correctamente como una burbuja. La actividad se debe poder cambiar de tamaño y debe estar incorporada. En cambio, si falta alguno de estos requisitos, se muestra como una notificación.
En el siguiente código, se demuestra cómo implementar una burbuja sencilla:
<activity
android:name=".bubbles.BubbleActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_bubble"
android:allowEmbedded="true"
android:resizeableActivity="true"
/>
Si tu app muestra varias burbujas del mismo tipo, como diferentes conversaciones de chat con distintos contactos, la actividad debe poder iniciar más de una instancia. En los dispositivos que ejecutan Android 10, las notificaciones no se muestran como burbujas, a menos que establezcas de forma explícita documentLaunchMode
en "always"
. A partir de Android 11, no necesitas configurar de forma explícita este valor, ya que el sistema establece automáticamente el documentLaunchMode
de todas las conversaciones en "always"
.
Para enviar una burbuja, sigue estos pasos:
- Crea una notificación como lo harías normalmente.
- Llama a
BubbleMetadata.Builder(PendingIntent, Icon)
oBubbleMetadata.Builder(String)
para crear un objeto BubbleMetadata. - Usa el método
setBubbleMetadata()
para agregar los metadatos a la notificación. - Si orientas tu app a Android 11 o versiones posteriores, los metadatos o la notificación de burbuja deben hacer referencia a un acceso directo de uso compartido.
Kotlin
// Create bubble intent val target = Intent(context, BubbleActivity::class.java) val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */) val category = "com.example.category.IMG_SHARE_TARGET" val chatPartner = Person.Builder() .setName("Chat partner") .setImportant(true) .build() // Create sharing shortcut val shortcutId = generateShortcutId() val shortcut = ShortcutInfo.Builder(mContext, shortcutId) .setCategories(setOf(category)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.name) .build() // Create bubble metadata val bubbleData = Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build() // Create notification, referencing the sharing shortcut val builder = Notification.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner)
Java
// Create bubble intent Intent target = new Intent(mContext, BubbleActivity.class); PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0 /* flags */); private val CATEGORY_TEXT_SHARE_TARGET = "com.example.category.IMG_SHARE_TARGET" Person chatPartner = new Person.Builder() .setName("Chat partner") .setImportant(true) .build(); // Create sharing shortcut private String shortcutId = generateShortcutId(); ShortcutInfo shortcut = new ShortcutInfo.Builder(mContext, shortcutId) .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET)) .setIntent(Intent(Intent.ACTION_DEFAULT)) .setLongLived(true) .setShortLabel(chatPartner.getName()) .build(); // Create bubble metadata Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder(bubbleIntent, Icon.createWithResource(context, R.drawable.icon)) .setDesiredHeight(600) .build(); // Create notification, referencing the sharing shortcut Notification.Builder builder = new Notification.Builder(mContext, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(smallIcon) .setBubbleMetadata(bubbleData) .setShortcutId(shortcutId) .addPerson(chatPartner);
Si tu app está en primer plano cuando se envía una burbuja, la importancia se ignorará y la burbuja se mostrará siempre (a menos que el usuario haya bloqueado las notificaciones o las burbujas de tu app).
Cómo crear una burbuja expandida
Puedes configurar tu burbuja para presentarla en estado expandido automáticamente. Te recomendamos que solo uses esta funcionalidad si el usuario realiza una acción que generaría una burbuja, como presionar un botón para iniciar un nuevo chat. En este caso, también tiene sentido suprimir la notificación inicial enviada cuando se crea una burbuja.
Puedes usar los siguientes métodos para configurar indicadores que permitan estos comportamientos: setAutoExpandBubble()
y setSuppressNotification()
.
Kotlin
val bubbleMetadata = Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build()
Java
Notification.BubbleMetadata bubbleData = new Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIntent(bubbleIntent) .setAutoExpandBubble(true) .setSuppressNotification(true) .build();
Ciclo de vida del contenido del cuadro
Cuando se expande una burbuja, la actividad del contenido pasa por el ciclo de vida del proceso normal, que convierte la app en un proceso en primer plano (si aún no lo es).
Cuando se contrae o se descarta la burbuja, se destruye la actividad, lo cual podría provocar que el proceso se almacene en caché y, luego, se finalice, dependiendo de si la app tiene otros componentes en ejecución en primer plano.
Cuándo aparecen las burbujas
A fin de reducir la cantidad de interrupciones para el usuario, las burbujas solo aparecen en determinadas circunstancias.
Si una app se orienta a Android 11 o a una versión posterior, la notificación no aparecerá como una burbuja, a menos que cumpla con los requisitos de conversación. Si una app se orienta a Android 10, la notificación aparece como una burbuja solo si se cumplen una o más de las siguientes condiciones:
- La notificación usa MessagingStyle y se agrega un elemento Person.
- La notificación proviene de una llamada a Service.startForeground, tiene una category de CATEGORY_CALL y tiene agregada la clase Person.
- La app está en primer plano cuando se envía la notificación.
Si no se cumple ninguna de esas condiciones, se muestra la notificación en lugar de una burbuja.
Prácticas recomendadas
- Las burbujas ocupan espacio de la pantalla y cubren otros contenidos de las apps. Solo debes enviar una notificación con formato de burbuja si su importancia lo amerita; por ejemplo, si se trata de una comunicación en curso o si el usuario solicitó explícitamente una burbuja para determinado contenido.
- Ten en cuenta que el usuario puede inhabilitar la burbuja. En tal caso, esa burbuja aparece con formato de notificación normal. Siempre debes configurar la burbuja para que también funcione como una notificación común.
- Los procesos que se inician desde una burbuja (como actividades y diálogos) aparecen dentro del contenedor correspondiente. Esto quiere decir que una burbuja puede tener una pila de tareas. El entorno puede volverse problemático si hay demasiadas funciones o acciones de navegación dentro de tu burbuja. Recomendamos mantener las funciones tan livianas y específicas como sea posible.
- Asegúrate de llamar a super.onBackPressed cuando anules onBackPressed en la actividad de la Burbuja; de lo contrario, su comportamiento podría no ser el adecuado.
- Cuando una burbuja contraída recibe un mensaje actualizado, esta muestra un ícono de distintivo para indicar que hay un mensaje sin leer. Cuando el usuario abra el mensaje en la app asociada, sigue estos pasos:
- Actualiza
BubbleMetadata
para suprimir la notificación. Llama aBubbleMetadata.Builder.setSupressNotification()
. Esto quita el ícono distintivo para indicar que el usuario realizó una acción en el mensaje. - Se establece
Notification.Builder.setOnlyAlertOnce()
como verdadero para suprimir el sonido o la vibración que acompaña a la actualizaciónBubbleMetadata
.
- Actualiza
App de ejemplo
La app de ejemplo de Personas es una simple app de conversación que usa burbujas. A modo de demostración, esta app usa chat bots. En las aplicaciones del mundo real, solo los seres humanos pueden usar las burbujas, no los bots.