Criar uma notificação expansível

Uma notificação básica geralmente inclui um título, uma linha de texto e uma ou mais ações que o usuário pode realizar em resposta. Para disponibilizar ainda mais informações, você também pode criar notificações grandes e expansíveis aplicando um dos vários modelos de notificação, conforme descrito nesta página.

Para começar, crie uma notificação com todo o conteúdo básico, conforme descrito em Criar uma notificação. Em seguida, chame setStyle() com um objeto de estilo e forneça informações correspondentes a cada modelo, como mostrado abaixo.

Adicionar uma imagem grande

Para adicionar uma imagem à sua notificação, passe uma instância de NotificationCompat.BigPictureStyle para setStyle().

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setStyle(NotificationCompat.BigPictureStyle()
                    .bigPicture(myBitmap))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setStyle(new NotificationCompat.BigPictureStyle()
                   .bigPicture(myBitmap))
            .build();
    

Para que a imagem apareça como miniatura enquanto a notificação estiver recolhida (como mostra a figura 1), chame setLargeIcon() e passe a ele a imagem, mas também chame BigPictureStyle.bigLargeIcon() e passe null para que o ícone grande desapareça quando a notificação for expandida:

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setLargeIcon(myBitmap)
            .setStyle(NotificationCompat.BigPictureStyle()
                    .bigPicture(myBitmap)
                    .bigLargeIcon(null))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_post)
            .setContentTitle(imageTitle)
            .setContentText(imageDescription)
            .setLargeIcon(myBitmap)
            .setStyle(new NotificationCompat.BigPictureStyle()
                    .bigPicture(myBitmap)
                    .bigLargeIcon(null))
            .build();
    

Figura 1. Uma notificação usando NotificationCompat.BigPictureStyle

Adicionar um bloco grande de texto

Aplique NotificationCompat.BigTextStyle para exibir o texto na área de conteúdo expandido da notificação:

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setStyle(NotificationCompat.BigTextStyle()
                    .bigText(emailObject.getSubjectAndSnippet()))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle(emailObject.getSenderName())
            .setContentText(emailObject.getSubject())
            .setLargeIcon(emailObject.getSenderAvatar())
            .setStyle(new NotificationCompat.BigTextStyle()
                    .bigText(emailObject.getSubjectAndSnippet()))
            .build();
    

Figura 2. Uma notificação usando NotificationCompat.BigTextStyle

Dica: para adicionar formatação ao texto (negrito, itálico, quebras de linha etc.), adicione estilo com marcação HTML.

Criar uma notificação no estilo de caixa de entrada

Aplique NotificationCompat.InboxStyle a uma notificação se você quiser adicionar várias linhas de resumo curtas, como snippets de e-mails recebidos. Isso permite adicionar várias partes de texto do conteúdo que são truncadas em uma linha, em vez de uma linha contínua de texto fornecida por NotificationCompat.BigTextStyle.

Para adicionar uma nova linha, chame addLine() até seis vezes. Se você adicionar mais de seis linhas, apenas as seis primeiras poderão ser vistas.

Kotlin

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle("5 New mails from " + sender.toString())
            .setContentText(subject)
            .setLargeIcon(aBitmap)
            .setStyle(NotificationCompat.InboxStyle()
                    .addLine(messageSnippet1)
                    .addLine(messageSnippet2))
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_mail)
            .setContentTitle("5 New mails from " + sender.toString())
            .setContentText(subject)
            .setLargeIcon(aBitmap)
            .setStyle(new NotificationCompat.InboxStyle()
                    .addLine(messageSnippet1)
                    .addLine(messageSnippet2))
            .build();
    

Dica: você pode distinguir o assunto e a mensagem em cada linha adicionando estilo com marcação HTML (como negrito no assunto).

Mostrar uma conversa em uma notificação

Aplique NotificationCompat.MessagingStyle para exibir mensagens sequenciais entre qualquer número de pessoas. Essa opção é ideal para apps de mensagens, porque oferece um layout consistente para cada uma delas, gerenciando o nome do remetente e o texto separadamente. Além disso, cada mensagem pode ter várias linhas.

Para adicionar uma nova mensagem, chame addMessage(), passando o texto da mensagem, a hora do recebimento e o nome do remetente. Você também pode passar essas informações como um objeto NotificationCompat.MessagingStyle.Message.

Kotlin

    var message1 = NotificationCompat.MessagingStyle.Message(messages[0].getText(),
            messages[0].getTime(),
            messages[0].getSender())
    var message2 = NotificationCompat.MessagingStyle.Message(messages[1].getText(),
            messages[1].getTime(),
            messages[1].getSender())
    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_message)
            .setStyle(NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                    .addMessage(message1)
                    .addMessage(message2))
            .build()
    

Java

    NotificationCompat.MessagingStyle.Message message1 =
            new NotificationCompat.MessagingStyle.Message(messages[0].getText(),
                                                          messages[0].getTime(),
                                                          messages[0].getSender());
    NotificationCompat.MessagingStyle.Message message2 =
            new NotificationCompat.MessagingStyle.Message(messages[1].getText(),
                                                          messages[1].getTime(),
                                                          messages[1].getSender());

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            .setSmallIcon(R.drawable.new_message)
            .setStyle(new NotificationCompat.MessagingStyle(resources.getString(R.string.reply_name))
                    .addMessage(message1)
                    .addMessage(message2))
            .build();
    

Figura 3. Uma notificação usando NotificationCompat.MessagingStyle

Como alternativa, você pode chamar setConversationTitle() para adicionar um título que é exibido acima da conversa. Esse título pode ser o nome do grupo criado pelo usuário ou, se não houver um nome específico, a lista dos participantes da conversa. Não defina um título de conversa para chats individuais, porque o sistema usa a existência desse campo como uma dica de que a conversa é um grupo.

Esse estilo só é válido para dispositivos com o Android 7.0 (API de nível 24) e mais recente. Ao usar a biblioteca de compatibilidade (NotificationCompat), como demonstrado acima, as notificações com MessagingStyle retornarão automaticamente para um estilo de notificação expandida compatível.

Ao criar uma notificação como essa para um chat, adicione também uma ação de resposta direta.

Criar uma notificação com controles de mídia

Aplique NotificationCompat.MediaStyle para exibir controles de reprodução de mídia e rastrear informações.

Chame addAction() até cinco vezes para exibir até cinco botões de ícones diferentes. E chame setLargeIcon() para definir a capa do álbum.

Ao contrário dos outros estilos de notificação, o MediaStyle também permite modificar a exibição de conteúdo recolhido especificando três botões de ação que também aparecerão na exibição recolhida. Para isso, forneça os índices do botão de ação para setShowActionsInCompactView().

Se a notificação representar uma sessão de mídia ativa, anexe também um MediaSession.Token à notificação usando setMediaSession(). O Android identifica isso como uma notificação que representa uma sessão de mídia ativa e responde da forma adequada (mostrando a capa do álbum na tela de bloqueio, por exemplo).

Kotlin

    import android.support.v4.app.NotificationCompat
    import android.support.v4.media.app.NotificationCompat as MediaNotificationCompat

    var notification = NotificationCompat.Builder(context, CHANNEL_ID)
            // Show controls on lock screen even when user hides sensitive content.
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_stat_player)
            // Add media control buttons that invoke intents in your media service
            .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
            .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent) // #1
            .addAction(R.drawable.ic_next, "Next", nextPendingIntent) // #2
            // Apply the media style template
            .setStyle(MediaNotificationCompat.MediaStyle()
                    .setShowActionsInCompactView(1 /* #1: pause button \*/)
                    .setMediaSession(mediaSession.getSessionToken()))
            .setContentTitle("Wonderful music")
            .setContentText("My Awesome Band")
            .setLargeIcon(albumArtBitmap)
            .build()
    

Java

    Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
            // Show controls on lock screen even when user hides sensitive content.
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_stat_player)
            // Add media control buttons that invoke intents in your media service
            .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
            .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent)  // #1
            .addAction(R.drawable.ic_next, "Next", nextPendingIntent)     // #2
            // Apply the media style template
            .setStyle(new android.support.v4.media.app.Notification.MediaStyle()
                    .setShowActionsInCompactView(1 /* #1: pause button */)
                    .setMediaSession(mediaSession.getSessionToken()))
            .setContentTitle("Wonderful music")
            .setContentText("My Awesome Band")
            .setLargeIcon(albumArtBitmap)
            .build();
    

Figura 4. Uma notificação usando NotificationCompat.MediaStyle

Para mais informações, leia também Como usar as notificações do MediaStyle com um serviço em primeiro plano. Para ver o exemplo de código que usa notificações, consulte o Exemplo de notificações do Android (em inglês).