Cómo crear un grupo de notificaciones

A partir de Android 7.0 (API nivel 24), puedes mostrar notificaciones relacionadas en un grupo (anteriormente llamadas notificaciones "agrupadas"). Por ejemplo, si tu app muestra notificaciones de los correos electrónicos recibidos, deberías incluir todas las notificaciones en el mismo grupo de manera que puedan contraerse en conjunto.

Para admitir versiones anteriores, también puedes agregar una notificación de resumen que aparezca sola y sintetice todas las notificaciones individuales (este enfoque suele funcionar mejor en las notificaciones con estilo de bandeja de entrada).

Figura 1: Un grupo de notificaciones expandido y contraído

Solo debes usar los grupos de notificaciones si se cumplen todas las condiciones siguientes en tu caso práctico:

  • Las notificaciones secundarias son notificaciones completas y se pueden mostrar individualmente sin la necesidad de un resumen del grupo.
  • El aislamiento de notificaciones secundarias de forma individual tiene un beneficio. Por ejemplo:
    • Son interactivas, con acciones específicas para cada notificación.
    • Hay más información en cada notificación que el usuario debería ver.

Si tus notificaciones no cumplen con los criterios que se mencionan arriba, procura actualizar una notificación existente con información nueva o crear una notificación con estilo de mensaje para mostrar varias actualizaciones en la misma conversación.

Cómo crear un grupo y agregar una notificación en él

Si quieres crear un grupo de notificaciones, define una string de identificador único para el grupo. Luego, en cada notificación que quieras incluir en este, solo tienes que llamar a setGroup() y pasar el nombre del grupo. Por ejemplo:

Kotlin

    val GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL"

    val newMessageNotification = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setGroup(GROUP_KEY_WORK_EMAIL)
            .build()
    

Java

    String GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL";

    Notification newMessageNotification = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setGroup(GROUP_KEY_WORK_EMAIL)
            .build();
    

De manera predeterminada, las notificaciones se ordenan según el momento de su publicación, pero puedes llamar a setSortKey() para modificar el orden.

Si las alertas de un grupo de notificaciones deben administrarse con una notificación diferente, llama a setGroupAlertBehavior(). Por ejemplo, si solo quieres que el resumen de tu grupo emita sonido, todas las notificaciones secundarias del grupo deberían tener el comportamiento de alerta de grupo GROUP_ALERT_SUMMARY. Las otras opciones son GROUP_ALERT_ALL y GROUP_ALERT_CHILDREN.

Cómo configurar un resumen de grupo

En Android 7.0 (API nivel 24) y versiones posteriores, el sistema crea un resumen automáticamente para tu grupo con fragmentos de texto de cada notificación. El usuario puede expandir esta notificación para ver cada una por separado, como se muestra en la figura 1. Para admitir versiones anteriores que no puedan mostrar un grupo anidado de notificaciones, debes crear una notificación adicional que actúe como resumen. Esta aparecerá como única notificación y el sistema ocultará las demás. Por lo tanto, este resumen debería incluir un fragmento de todas las otras notificaciones, que el usuario puede presionar para abrir tu app.

Para agregar un resumen de grupo, haz lo siguiente:

  1. Crea una nueva notificación con una descripción del grupo (este enfoque suele funcionar mejor en las notificaciones con estilo de bandeja de entrada).
  2. Llama a setGroup() para agregar la notificación de resumen al grupo.
  3. Llama a setGroupSummary(true) para especificar que esta debería usarse como resumen de grupo.

Por ejemplo:

Kotlin

    //use constant ID for notification used as group summary
    val SUMMARY_ID = 0
    val GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL"

    val newMessageNotification1 = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_notify_email_status)
            .setContentTitle(emailObject1.getSummary())
            .setContentText("You will not believe...")
            .setGroup(GROUP_KEY_WORK_EMAIL)
            .build()

    val newMessageNotification2 = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_notify_email_status)
            .setContentTitle(emailObject2.getSummary())
            .setContentText("Please join us to celebrate the...")
            .setGroup(GROUP_KEY_WORK_EMAIL)
            .build()

    val summaryNotification = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
            .setContentTitle(emailObject.getSummary())
            //set content text to support devices running API level < 24
            .setContentText("Two new messages")
            .setSmallIcon(R.drawable.ic_notify_summary_status)
            //build summary info into InboxStyle template
            .setStyle(NotificationCompat.InboxStyle()
                    .addLine("Alex Faarborg Check this out")
                    .addLine("Jeff Chang Launch Party")
                    .setBigContentTitle("2 new messages")
                    .setSummaryText("janedoe@example.com"))
            //specify which group this notification belongs to
            .setGroup(GROUP_KEY_WORK_EMAIL)
            //set this notification as the summary for the group
            .setGroupSummary(true)
            .build()

    NotificationManagerCompat.from(this).apply {
        notify(emailNotificationId1, newMessageNotification1)
        notify(emailNotificationId2, newMessageNotification2)
        notify(SUMMARY_ID, summaryNotification)
    }
    

Java

    //use constant ID for notification used as group summary
    int SUMMARY_ID = 0;
    String GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL";

    Notification newMessageNotification1 =
        new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_notify_email_status)
            .setContentTitle(emailObject1.getSummary())
            .setContentText("You will not believe...")
            .setGroup(GROUP_KEY_WORK_EMAIL)
            .build();

    Notification newMessageNotification2 =
        new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_notify_email_status)
            .setContentTitle(emailObject2.getSummary())
            .setContentText("Please join us to celebrate the...")
            .setGroup(GROUP_KEY_WORK_EMAIL)
            .build();

    Notification summaryNotification =
        new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
            .setContentTitle(emailObject.getSummary())
            //set content text to support devices running API level < 24
            .setContentText("Two new messages")
            .setSmallIcon(R.drawable.ic_notify_summary_status)
            //build summary info into InboxStyle template
            .setStyle(new NotificationCompat.InboxStyle()
                    .addLine("Alex Faarborg  Check this out")
                    .addLine("Jeff Chang    Launch Party")
                    .setBigContentTitle("2 new messages")
                    .setSummaryText("janedoe@example.com"))
            //specify which group this notification belongs to
            .setGroup(GROUP_KEY_WORK_EMAIL)
            //set this notification as the summary for the group
            .setGroupSummary(true)
            .build();

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(emailNotificationId1, newMessageNotification1);
    notificationManager.notify(emailNotificationId2, newMessageNotification2);
    notificationManager.notify(SUMMARY_ID, summaryNotification);
    

El ID de la notificación de resumen debería mantenerse igual de manera que solo se publique una vez y puedas actualizarlo posteriormente en caso de que se modifique la información (las adiciones posteriores al grupo deberían actualizar el resumen existente).

Para ver un código de ejemplo que usa notificaciones, consulta Ejemplo de notificaciones de Android.