Cómo crear una notificación expandible

Por lo general, una notificación básica incluye un título, una línea de texto y acciones que el usuario puede realizar en respuesta. Para proporcionar más información, puedes crear notificaciones grandes y expandibles aplicando una de las varias plantillas de notificación que se describen en este documento.

Para comenzar, crea una notificación con todo el contenido básico, como se describe en Cómo crear una notificación. Luego, llama a setStyle() con un objeto de diseño y proporciona información correspondiente a cada plantilla, como se muestra en los siguientes ejemplos.

Cómo agregar una imagen grande

Para agregar una imagen a tu notificación, pasa una instancia de NotificationCompat.BigPictureStyle a setStyle().

var notification =
    NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(com.example.compose.snippets.R.drawable.ic_logo)
        .setContentTitle("Title")
        .setContentText("Content text")
        .setStyle(
            NotificationCompat.BigPictureStyle()
                .bigPicture(bitmapImage)
        )
        .build()

Para que la imagen aparezca solo como miniatura mientras la notificación está contraída, como se muestra en la siguiente figura, llama a setLargeIcon() y pásale la imagen. Luego, llama a BigPictureStyle.bigLargeIcon() y pásale null para que el ícono grande desaparezca cuando se expanda la notificación:

notification = NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_logo)
    .setContentTitle("Title")
    .setContentText("Content text")
    .setLargeIcon(Icon.createWithResource(context, R.drawable.dog))
    .setStyle(
        NotificationCompat.BigPictureStyle()
            .bigPicture(bitmapImage)
            .bigLargeIcon(null as Bitmap?)
    )
    .build()

Una notificación contraída y una notificación expandida que contienen una imagen azul
Figura 1. Una notificación que usa NotificationCompat.BigPictureStyle.

Cómo agregar un bloque de texto grande

Aplica NotificationCompat.BigTextStyle para mostrar texto en el área de contenido expandido de la notificación:

notification = NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_logo)
    .setContentTitle("Sender name")
    .setContentText("Email subject")
    .setLargeIcon(Icon.createWithResource(context, R.drawable.dog))
    .setStyle(
        NotificationCompat.BigTextStyle()
            .bigText(someVeryLongMessage)
    )
    .build()

Una notificación contraída y una notificación expandida con BigTextStyle
Figura 2. Una notificación que usa NotificationCompat.BigTextStyle.

Cómo crear una notificación con estilo de bandeja de entrada

Aplica NotificationCompat.InboxStyle a una notificación si deseas agregar varias líneas de resumen breves, como fragmentos de correos electrónicos entrantes. Esto te permite agregar varios fragmentos de texto de contenido, cada uno truncado a una línea, en lugar de la línea continua de texto que proporciona NotificationCompat.BigTextStyle.

Para agregar una línea nueva, llama a addLine() hasta seis veces, como se muestra en el siguiente ejemplo. Si agregas más de seis líneas, solo se verán las primeras seis.

notification = NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.mail)
    .setContentTitle("5 New mails from Frank")
    .setContentText("Check them out")
    .setLargeIcon(bitmapImage)
    .setStyle(
        NotificationCompat.InboxStyle()
            .addLine("Re: Planning")
            .addLine("Delivery on its way")
            .addLine("Follow-up")
    )
    .build()

El resultado se parece a la siguiente figura:

Una notificación expandida al estilo de Recibidos
Figura 3. Es una notificación expandida al estilo de la bandeja de entrada.

Cómo mostrar una conversación en una notificación

Aplica NotificationCompat.MessagingStyle para mostrar mensajes secuenciales entre cualquier cantidad de personas. Esto es ideal para las apps de mensajería, ya que proporciona un diseño coherente para cada mensaje controlando el nombre del remitente y el texto del mensaje por separado, y cada mensaje puede tener varias líneas.

Para agregar un mensaje nuevo, llama a addMessage() y pasa el texto del mensaje, la hora de recepción y el nombre del remitente. También puedes pasar esta información como un objeto NotificationCompat.MessagingStyle.Message, como se muestra en el siguiente ejemplo:

val message1 = NotificationCompat.MessagingStyle.Message(
    messages[0].text,
    messages[0].time,
    messages[0].sender
)
val message2 = NotificationCompat.MessagingStyle.Message(
    messages[1].text,
    messages[1].time,
    messages[1].sender
)
notification = NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_logo)
    .setStyle(
        NotificationCompat.MessagingStyle(Person.Builder().setName("Me").build())
            .addMessage(message1)
            .addMessage(message2)
    )
    .build()

Una notificación con estilo de mensajería
Figura 4. Una notificación que usa NotificationCompat.MessagingStyle.

Cuando se usa NotificationCompat.MessagingStyle, se ignoran los valores proporcionados a setContentTitle() y setContentText().

Puedes llamar a setConversationTitle() para agregar un título que aparezca sobre la conversación. Puede ser el nombre del grupo creado por el usuario o, si no tiene un nombre específico, una lista de los participantes en la conversación. No establezcas un título de conversación para los chats individuales, ya que el sistema usa la existencia de este campo como una sugerencia de que la conversación es un grupo.

Este estilo solo se aplica en dispositivos que ejecutan Android 7.0 (nivel de API 24) y versiones posteriores. Cuando se usa la biblioteca de compatibilidad (NotificationCompat), como se demostró anteriormente, las notificaciones con MessagingStyle recurren automáticamente a un estilo de notificación expandida compatible.

Cuando crees una notificación como esta para una conversación de chat, agrega una acción de respuesta directa.

Cómo crear una notificación con controles de contenido multimedia

Aplica MediaStyleNotificationHelper.MediaStyle para mostrar los controles de reproducción de contenido multimedia y la información de seguimiento.

Especifica tu MediaSession asociado en el constructor. Esto permite que Android muestre la información correcta sobre tu contenido multimedia.

Llama a addAction() hasta cinco veces para mostrar hasta cinco botones de ícono. Llama a setLargeIcon() para establecer la imagen del álbum.

A diferencia de los otros estilos de notificación, MediaStyle también te permite modificar la vista de contenido de tamaño reducido especificando tres botones de acción que también aparecen en la vista reducida. Para ello, proporciona los índices de los botones de acción a setShowActionsInCompactView().

En el siguiente ejemplo, se muestra cómo crear una notificación con controles multimedia:

notification = NotificationCompat.Builder(context, CHANNEL_ID)
    // Show controls on lock screen even when user hides sensitive content.
    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
    .setSmallIcon(com.example.compose.snippets.R.drawable.play)
    // Add media control buttons that invoke intents in your media service
    .addAction(R.drawable.previous, "Previous", null /* Add valid intent */) // #0
    .addAction(R.drawable.pause, "Pause", null /* Add valid intent */) // #1
    .addAction(R.drawable.next, "Next", null /* Add valid intent */) // #2
    // Apply the media style template.
    .setStyle(MediaStyleNotificationHelper.MediaStyle(mediaSession)
        .setShowActionsInCompactView(1 /* #1: pause button */))
    .setContentTitle("Wonderful music")
    .setContentText("My Awesome Band")
    .setLargeIcon(bitmapImage)
    .build()

Una notificación con estilo de medios
Figura 5. Una notificación que usa MediaStyleNotificationHelper.MediaStyle.

Recursos adicionales

Consulta las siguientes referencias para obtener más información sobre MediaStyle y las notificaciones expandibles.