一. 通知组简介
从 Android 7.0(API 级别 24)开始,您可以在一个组中显示相关通知。如下所示:
图 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();
默认情况下,系统会根据通知的发布时间对其进行排序,下面是几个常用的接口:
- setSortKey(@Nullable String sortKey ) : 更改通知顺序.
- 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 所示。
添加通知组摘要,请按以下步骤操作:
-
创建包含通知组说明的新通知 - 通常最好使用收件箱样式的通知来完成。
-
通过调用
setGroup()
将摘要通知添加到通知组中。 -
通过调用 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 条或更多通知,并且未指定组键或组摘要,系统可能会自动将这些通知分为一组。系统会自动分组显示通知,并附带通知组摘要通知,该摘要通知会标有某些分组通知的文本片段。与手动分组的通知一样,用户可以展开此摘要通知以查看各个通知。