一. 通知组简介

从 Android 7.0(API 级别 24)开始,您可以在一个组中显示相关通知。如下所示:

Android 通知组-LMLPHP

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

注意 :如果应用发出 4 条或更多条通知且未指定通知组,则系统会在 Android 7.0 及更高版本上将这些通知自动分组。

二. 通知组使用场景

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

  • 单独显示子级通知有一个好处。例如:

    • 它们是可操作的,具体操作特定于每条通知。

    • 每条通知中都包含更多信息供用户查看。

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

//该通知组定义一个唯一标识符字符串,即通知组名
String GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL";

Notification newMessageNotification = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
        .setSmallIcon(R.drawable.smallIcon)
        .setContentTitle("title")
        .setContentText("content")
        .setLargeIcon(emailObject.getSenderAvatar())
        .setGroup(GROUP_KEY_WORK_EMAIL)//将该通知添加到指定通知组名的通知组中,其中通知组名称为 ROUP_KEY_WORK_EMAIL的字符床
        .build();

默认情况下,系统会根据通知的发布时间对其进行排序,下面是几个常用的接口:

  1. setSortKey(@Nullable String sortKey ) : 更改通知顺序.
  2. setGroupAlertBehavior(int groupAlertBehavior) : 针对某个通知组的提醒必须由其他通知处理

其中的参数为:

  • GROUP_ALERT_ALL = 0(默认值) : 组中所有具有声音或振动的通知都应该发出声音或振动(分别),因此此通知在组中时不会被静音。
  • GROUP_ALERT_SUMMARY = 1 : 表示组中的所有子通知都应静音(无声音或振动),即使它们本来会发出声音或振动。如果此通知是组子项,请使用此常量将此通知静音。这必须应用于要静音的所有子通知。
  • GROUP_ALERT_CHILDREN  = 2: 组中的摘要通知应该静音(无声音或振动),即使它们本来会发出声音或振动。如果此通知是组摘要,请使用此常量将此通知静音。

四. 设置通知组摘要

分组通知必须有一个额外的通知来充当通知组摘要。要启用分组通知,必须设置通知组摘要。此通知组摘要必须包含通知组中其他通知的部分文本,以便了解通知组的内容。群组摘要的显示方式取决于 Android 版本:

  • 在低于 7.0(API 级别 24)的 Android 版本中,由于无法显示嵌套通知组,系统仅显示通知组摘要通知,而隐藏所有其他通知。用户可以点按群组摘要通知以打开应用。

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

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

  1. 创建包含通知组说明的新通知 - 通常最好使用收件箱样式的通知来完成。

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

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

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

// 使用常量 ID 作为组摘要的通知。
int SUMMARY_ID = 0;
// 定义通知组名
String GROUP_KEY_WORK_EMAIL = "com.android.example.WORK_EMAIL";

Notification newMessageNotification1 =
    new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
        .setSmallIcon(R.drawable.smallIcon_1)
        .setContentTitle("title_1")
        .setContentText("You will not believe...")
        .setGroup(GROUP_KEY_WORK_EMAIL)
        .build();

Notification newMessageNotification2 =
    new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
        .setSmallIcon(R.drawable.smallIcon_2)
        .setContentTitle("title_2")
        .setContentText("Please join us to celebrate the...")
        .setGroup(GROUP_KEY_WORK_EMAIL)
        .build();
//摘要通知
Notification summaryNotification =
    new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
        .setContentTitle("summary_title")
        // 为了兼容 android API level < 24.
        .setContentText("2条新通知")
        .setSmallIcon(R.drawable.summaryIcon)
        // 将摘要信息构建到 InboxStyle 模板中
        .setStyle(new NotificationCompat.InboxStyle()
                .addLine("第一行内容...")
                .addLine("第二行内容...)
                .setBigContentTitle("2条新消息")
                .setSummaryText("详细信息部分后的第一行文本"))
        //指定通知所属的组名
        .setGroup(GROUP_KEY_WORK_EMAIL)
        //将通知设置为组的摘要
        .setGroupSummary(true)
        .build();

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(emailNotificationId1, newMessageNotification1);
notificationManager.notify(emailNotificationId2, newMessageNotification2);
notificationManager.notify(SUMMARY_ID, summaryNotification);

摘要通知 ID 必须保持不变,以便仅发布一次,日后在摘要信息发生更改时进行更新。后续向该组添加内容会更新现有摘要。

五. 自动分组

在 Android 7.0(API 级别 24)及更高版本中,如果应用发送了 4 条或更多通知,并且未指定组键或组摘要,系统可能会自动将这些通知分为一组。系统会自动分组显示通知,并附带通知组摘要通知,该摘要通知会标有某些分组通知的文本片段。与手动分组的通知一样,用户可以展开此摘要通知以查看各个通知。

07-01 20:50