Criar um grupo de notificações

A partir do Android 7.0 (API nível 24), você pode exibir notificações relacionadas em um grupo (conhecidas anteriormente como notificações "agrupadas"). Por exemplo, se seu app mostra notificações para e-mails recebidos, você deve colocar todas as notificações no mesmo grupo, para que elas possam ser recolhidas juntas.

Para oferecer compatibilidade com versões mais antigas, adicione também uma notificação de resumo que aparece sozinha para resumir todas as notificações separadas. Geralmente, a melhor opção para fazer isso é usar a notificação no estilo da caixa de entrada.

Figura 1. Um grupo de notificações recolhido e expandido.

Use grupos de notificações apenas quando todas as condições a seguir forem verdadeiras para seu caso de uso:

  • As notificações filhas são completas e podem ser exibidas individualmente sem necessidade de um resumo do grupo.
  • A exibição individual de notificações filhas pode ser vantajosa. Por exemplo:
    • Elas são acionáveis, sem ações específicas para cada notificação.
    • Há mais informações em cada notificação que o usuário deve ver.

Se suas notificações não atenderem aos critérios acima, atualize uma notificação existente com novas informações ou crie uma notificação no estilo de mensagem para mostrar várias atualizações na mesma conversa.

Criar um grupo e adicionar uma notificação

Para criar um grupo de notificações, defina uma string de identificador único para o grupo. Em seguida, para cada notificação que você quer inserir no grupo, basta chamar setGroup(), passando o nome do grupo. Por exemplo:

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();
    

Por padrão, as notificações são classificadas de acordo com o momento da postagem, mas você pode mudar essa ordem chamando setSortKey().

Se for necessário processar os alertas de um grupo de notificações por meio de uma notificação diferente, chame setGroupAlertBehavior(). Por exemplo, se você quer que apenas o resumo do grupo seja ouvido, todas as notificações filhas do grupo devem ter o comportamento de alerta GROUP_ALERT_SUMMARY. As outras opções são GROUP_ALERT_ALL e GROUP_ALERT_CHILDREN.

Definir um resumo do grupo

No Android 7.0 (API nível 24) e posterior, o sistema cria automaticamente um resumo para o grupo usando trechos de texto de cada notificação. O usuário pode expandir para ver cada notificação separada, conforme mostrado na figura 1. Para oferecer compatibilidade com versões mais antigas, que não mostram um grupo aninhado de notificações, é preciso criar uma notificação extra que atue como resumo. Ela é exibida como a única notificação, e o sistema oculta todas as outras. Portanto, esse resumo deve incluir um trecho de todas as outras notificações, em que o usuário pode tocar para abrir o app.

Para adicionar um resumo do grupo, faça o seguinte:

  1. Crie uma nova notificação com a descrição do grupo. Geralmente, a melhor opção para fazer isso é usar a notificação no estilo de caixa de entrada.
  2. Adicione a notificação de resumo ao grupo chamando setGroup().
  3. Especifique que ele deve ser usado como resumo do grupo chamando setGroupSummary(true).

Por exemplo:

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);
    

O código da notificação de resumo deve permanecer o mesmo para ser publicado apenas uma vez. Portanto, você poderá atualizá-lo mais tarde se as informações do resumo mudarem (adições posteriores ao grupo resultarão na atualização do resumo existente).

Para ver um exemplo de código que usa notificações, consulte o Exemplo de notificações do Android (em inglês).