Создание раскрывающегося уведомления

Обычное уведомление содержит заголовок, строку текста и действия, которые пользователь может выполнить в ответ. Чтобы предоставить пользователям больше информации, вы можете создать большие разворачиваемые уведомления, используя один из шаблонов, описанных в этом документе.

Сначала создайте уведомление с основным контентом, как описано в разделе Как создать уведомление. Затем вызовите функцию setStyle() с объектом стиля и предоставьте информацию, соответствующую каждому шаблону, как показано в следующих примерах.

Как добавить большое изображение

Чтобы добавить изображение в уведомление, передайте экземпляр NotificationCompat.BigPictureStyle в 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()

Чтобы изображение показывалось в виде значка только когда уведомление свернуто, как показано на рисунке ниже, вызовите метод setLargeIcon() и передайте ему изображение. Затем вызовите функцию BigPictureStyle.bigLargeIcon() и передайте ей null, чтобы большой значок исчез, когда уведомление будет развернуто:

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

Свернутое и развернутое уведомления с синим изображением
Рисунок 1. Уведомление с использованием NotificationCompat.BigPictureStyle.

Как добавить большой блок текста

Примените NotificationCompat.BigTextStyle, чтобы показать текст в развернутой области уведомления:

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

Свернутое и развернутое уведомления с использованием BigTextStyle
Рисунок 2. Уведомление с использованием NotificationCompat.BigTextStyle.

Как создать уведомление в стиле входящих писем

Используйте NotificationCompat.InboxStyle, если хотите добавить в уведомление несколько коротких строк, например фрагменты входящих писем. Это позволяет добавить несколько фрагментов текста, каждый из которых будет усечен до одной строки, вместо одной непрерывной строки текста, предоставляемой NotificationCompat.BigTextStyle.

Чтобы добавить новую строку, вызовите addLine() до шести раз, как показано в следующем примере. Если вы добавите больше шести строк, будут видны только первые шесть.

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

Результат будет выглядеть так, как показано на рисунке ниже.

Развернутое уведомление в стиле папки "Входящие"
Рисунок 3. Развернутое уведомление в стиле папки "Входящие".

Как посмотреть чат в уведомлении

Используйте NotificationCompat.MessagingStyle, чтобы показывать последовательные сообщения любому количеству пользователей. Это идеальный вариант для мессенджеров, поскольку он обеспечивает единообразный макет для каждого сообщения, обрабатывая имя отправителя и текст сообщения отдельно, и каждое сообщение может занимать несколько строк.

Чтобы добавить новое сообщение, вызовите addMessage(), передав текст сообщения, время получения и имя отправителя. Вы также можете передать эту информацию в виде объекта NotificationCompat.MessagingStyle.Message, как показано в следующем примере:

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

Уведомление в стиле сообщений
Рисунок 4. Уведомление с использованием NotificationCompat.MessagingStyle.

Если используется свойство NotificationCompat.MessagingStyle, то значения, заданные для свойств setContentTitle() и setContentText(), игнорируются.

Вы можете вызвать функцию setConversationTitle(), чтобы добавить заголовок, который будет показываться над чатом. Это может быть название группы, заданное пользователем, или, если оно не задано, список участников чата. Не задавайте название чата для переписки с одним пользователем, поскольку система использует наличие этого поля как признак того, что чат групповой.

Этот стиль применяется только на устройствах с Android 7.0 (уровень API 24) и более поздних версий. При использовании библиотеки совместимости (NotificationCompat), как показано выше, уведомления с MessagingStyle автоматически переключаются на поддерживаемый расширенный стиль уведомлений.

При создании уведомления для чата добавьте действие прямого ответа.

Как создать уведомление с элементами управления мультимедиа

Используйте MediaStyleNotificationHelper.MediaStyle, чтобы показывать элементы управления воспроизведением медиаконтента и отслеживать информацию.

Укажите связанный объект MediaSession в конструкторе. Это позволяет Android показывать правильную информацию о вашем медиаконтенте.

Вызовите метод addAction() до пяти раз, чтобы показать до пяти кнопок со значками. Вызывайте метод setLargeIcon(), чтобы задать обложку альбома,

В отличие от других стилей уведомлений, MediaStyle позволяет изменять контент в свернутом виде, добавляя три кнопки действий, которые также будут показываться в свернутом виде. Для этого укажите индексы командных кнопок в параметре setShowActionsInCompactView().

В примере ниже показано, как создать уведомление с элементами управления мультимедиа:

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

Уведомление с элементами управления мультимедиа
Рисунок 5. Уведомление с использованием MediaStyleNotificationHelper.MediaStyle.

Дополнительные ресурсы

Подробнее о MediaStyle и разворачиваемых уведомлениях можно узнать из следующих источников: