创建展开式通知

基本通知通常包括标题、一行文本,以及用户可以执行的一项或多项响应操作。要提供更多信息,您还可以应用本页介绍的多个通知模板之一来创建大型展开式通知。

首先,使用创建通知中介绍的所有基本内容创建通知。然后,使用一个样式对象调用 setStyle(),并提供与每个模板相对应的信息(如下所示)。

添加大图片

要在通知中添加一张图片,请将 NotificationCompat.BigPictureStyle 实例传递到 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();
    

要使该图片仅在通知收起时显示为缩略图(如图 1 所示),请调用 setLargeIcon() 并传入该图片,同时调用 BigPictureStyle.bigLargeIcon() 并传入 null,这样大图标就会在通知展开时消失:

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

图 1. 一个通知,使用 NotificationCompat.BigPictureStyle

添加一大段文本

应用 NotificationCompat.BigTextStyle,以在通知的展开内容区域显示文本:

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

图 2. 一个通知,使用 NotificationCompat.BigTextStyle

提示:要对文本添加格式(粗体、斜体、换行等等),您可以使用 HTML 标记添加样式

创建收件箱样式的通知

如果您想要添加多个简短的摘要行(例如收到的电子邮件的片段),可对通知应用 NotificationCompat.InboxStyle。这样,您就可以添加多条内容文本,并且每条文本均截断为一行,而不是显示为 NotificationCompat.BigTextStyle 提供的一行连续文本。

要添加新行,最多可调用 addLine() 6 次。如果添加的行超过 6 行,则仅显示前 6 行。

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

提示:通过使用 HTML 标记添加样式(例如加粗主题),您可以区分每行中的消息主题和消息内容。

在通知中显示对话

应用 NotificationCompat.MessagingStyle 可显示任意人数之间依序发送的消息。这是即时通讯应用的理想之选,因为它通过单独处理发送人姓名和消息文本为每条消息提供一致的布局,而且每条消息可以在多行中显示。

要添加新消息,请调用 addMessage(),并传入消息文本、接收时间和发送人姓名。您也可以将这些信息作为 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();
    

图 3. 一个通知,使用 NotificationCompat.MessagingStyle

(可选操作)您可以调用 setConversationTitle() 来添加显示在会话上方的标题。这可能是用户创建的群组名称,也可能是会话参与者的列表(如果没有具体名称)。不要为一对一聊天设置会话标题,因为系统会将此字段的存在当做表明会话是群组的提示。

此样式仅适用于搭载 Android 7.0(API 级别 24)及更高版本的设备。如上所示,使用兼容性内容库 (NotificationCompat) 时,采用 MessagingStyle 的通知会自动回退到支持的扩展通知样式。

在为聊天会话创建此类通知时,您还应添加直接回复操作

使用媒体控件创建通知

应用 NotificationCompat.MediaStyle 可显示媒体播放控件和曲目信息。

您最多可调用 addAction() 5 次,以显示最多 5 个单独的图标按钮。调用 setLargeIcon() 可设置专辑封面。

与其他通知样式不同,MediaStyle 还允许您通过指定三个操作按钮(这些操作按钮也应在收起的视图中显示)来修改收起尺寸的内容视图。为此,请向 setShowActionsInCompactView() 提供操作按钮索引。

如果通知表示活动媒体会话,则另外使用 setMediaSession() 在通知上附加 MediaSession.Token。然后,Android 会将其识别为表示活动媒体会话的通知并相应地做出响应(例如,通过在锁定屏幕中显示专辑封面)。

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

图 4. 一个通知,使用 NotificationCompat.MediaStyle

如需了解详情,另请参阅对前台服务使用 MediaStyle 通知。如要查看使用通知的示例代码,请参阅 Android 通知示例