创建一组通知

从 Android 7.0(API 级别 24)开始,您可以将相关通知显示在一个组中。例如,如果您的应用显示有关收到的电子邮件的通知,请将有关新电子邮件的所有通知放在同一组中,以便它们一起收起。

为了支持较低版本,请添加单独显示的摘要通知,以总结所有单独的通知。收件箱样式的通知是 执行此操作的通常方式。

收起和展开后的通知组
图 1.收起(顶部)和展开(底部) 后的通知组。

如果您的使用情形满足以下所有条件,请使用通知组:

  • 子通知是完整的通知,可以单独显示,而无需组摘要。

  • 单独显示子通知是有好处的。例如:

    • 它们具有特定于每个通知的操作。

    • 每个通知中都有更多信息供用户查看。

如果您的通知不符合上述条件,请考虑使用新信息更新现有通知,或创建消息样式的通知以在同一对话中显示多个更新。

创建通知组并为其添加通知

如需创建通知组,请为该组定义唯一的标识符字符串。 然后,对于您要添加到该组的每条通知,请调用 setGroup, 并传递组名称。例如:

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

默认情况下,通知会根据发布时间排序,但您 可以通过调用 setSortKey 来更改顺序。

如果通知组的提醒必须由不同的 通知处理,请调用 setGroupAlertBehavior。例如,如果您希望只有 组摘要发出声音,则组中的所有子通知都必须具有 组提醒行为 GROUP_ALERT_SUMMARY。其他选项包括 GROUP_ALERT_ALL 和 GROUP_ALERT_CHILDREN。

设置通知组摘要

分组通知必须有一个额外的通知作为组摘要。如需启用分组通知,您必须设置组摘要。此组摘要必须包含组中其他每个通知中的部分文本,以帮助用户了解组中的内容。组摘要的显示方式取决于 Android 版本:

  • 低于 7.0(API 级别 24)的 Android 版本无法显示嵌套的通知组,因此系统只会显示您的组摘要通知,并隐藏所有其他通知。用户可以点按组摘要通知以打开您的应用。

  • 在 Android 7.0 及更高版本中,系统会将您的组摘要通知显示为嵌套的通知组,并使用每个分组通知中的文本片段进行标记。它不会显示您在组摘要通知中设置的文本。用户可以展开嵌套的通知组,以查看组中的各个通知,如图 1 所示。

即使更高版本的 Android 不会显示您设计的组摘要文本,您也必须手动设置摘要才能启用分组通知。在某些设备类型(例如穿戴式设备)上,组摘要的行为可能会有所不同。在组摘要中设置富媒体内容有助于在所有设备和版本上提供最佳体验。

如需添加通知组摘要,请按以下步骤操作:

  1. 创建一个新通知,其中包含组的说明 - 通常最好 使用收件箱样式的通知来完成此操作。

  2. 通过调用 setGroup 将摘要通知添加到通知组中。

  3. 通过调用 setGroupSummary(true)指定必须将其用作组摘要。

以下代码展示了创建组摘要的示例:

// Use constant ID for notifications 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)
}

摘要通知 ID 必须保持不变,这样它只会发布一次,并且您可以在摘要信息发生变化时稍后对其进行更新。后续添加到组中的内容必须导致更新现有摘要。

自动分组

在 Android 7.0(API 级别 24)及更高版本中,如果您的应用发送通知且未指定组键或组摘要,系统可能会自动将这些通知分组。自动分组的通知会显示一个组摘要通知,该通知使用某些分组通知中的文本片段进行标记。用户可以展开此摘要通知以查看每个单独的通知,就像手动分组的通知一样。

在某些设备类型上,自动分组行为可能会有所不同。为了在所有设备和版本上提供最佳体验,如果您知道通知必须分组,请指定组键和组摘要以确保它们分组。