[Android] Notification, Channel, Group 区别

780 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

从Android API26 Oreo版本开始,改为只有在已有的Notification中添加Notification Channel时才会运行。
Notification Channel ID也应该给出,这样Channel可以自然区分。但是,我没有使用 Notification,所以我无法弄清楚两者之间的明显区别,因为在搜索时出现了其他问题。

基本上,创建 Channel 的原因是随着应用程序市场随着智能手机的引入而增长,应用程序的大小自然会增长,各种情况下的通知也会增加,而不是只有一个通知就足够的小规模应用程序。

以前,如果您不想收到通知,可以转到设置 -> 应用程序 -> 关闭该应用程序的通知。然而,如前所述,如果你在一个应用程序中屏蔽所有通知,即使是最重要的通知(例如聊天、提醒)也不会收到通知。Notification Channel 的诞生就是为了让这成为可能。

验证这一点的最简单方法是触发特定于场景的通知。

  • 当 Notification ID 和 Channel ID 相同时
  • 当 Notification ID 为个人ID且Channel ID相同时
  • Notification ID同理,Channel ID为个人ID
  • 当 Notification ID 和 Channel ID 都是单独的 ID 时

每种情况都是 Notification 发生 3 次以上后的结果。

当 Notification ID 和 Channel ID 相同时

即使您多次调用通知,您也会在顶部栏中收到相同的通知。
即使多次调用通知,也只会创建一个通道。

当Notification ID为个人ID且Channel ID相同时

如果多次调用该通知,顶部栏将显示相应数量的通知。
即使多次调用通知,也只会创建一个通道。

Notification ID同理,Channel ID为个人ID

即使您多次调用通知,您也会在顶部栏中收到相同的通知。
如果多次调用通知,则创建与相应数量一样多的通知通道。

当 Notification ID 和 Channel ID 都是单独的 ID 时

如果多次调用该通知,顶部栏将显示相应数量的通知。
如果多次调用通知,则创建与相应数量一样多的通知通道。

写这个帖子的原因是在这个项目中,我必须使用Foreground Service和通知功能。
在Foreground Service的情况下,通知也用于通知用户该服务正在后台运行。

在这种情况下,现有的通知和服务的通知应该不会重叠,所以我研究了区分它们的ID。
看了一下,好像没必要单独开一个通知通道,不过为了以防万一,还是把两个ID区分开来比较好。

新增

这一次,我们将了解 GroupNotification。
GroupNotification 是一个将多个通知绑定到一个组中的功能,也就是大家经常体验到的UI。

如上,两个通知在一个区域。关于这个 Group Notification ,有一件事我不知道。

在我目前正在开发的应用程序中,会收到一条通知,当用户单击该通知时,会有一个移动到相关活动的功能。
为此,我将指定通知类型的 putExtra 放在 Notification Builder 的 PendingIntent 中。

之所以插入notification类型而不是直接移动到对应的activity,是因为鉴权、登录、服务端数据调用都是在Splash Activity中完成的,必须无条件的走一遍,Splash的时候必须移动准备好了。

private fun getPendingIntent(alarmType: AlarmType?): PendingIntent {
    val contentIntent = Intent(context, SplashActivity::class.java).apply {
        action = Intent.ACTION_MAIN
        putExtra("alarmType", alarmType)
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        addCategory(Intent.CATEGORY_LAUNCHER)
    }
    return PendingIntent.getActivity(
        context,
        alarmType?.REQUEST_CODE ?: 0,
        contentIntent,
        PendingIntent.FLAG_IMMUTABLE
    )
}

并且在多个通知堆叠的情况下,当用户点击Group Notification本身时,并没有指定到哪里去,所以移动到默认的MainActivity。

private fun getGroupNotification(alarmType: AlarmType): NotificationCompat.Builder =
    NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    .setSmallIcon(R.drawable.ic_arrow_down)
    .setColor(context.getColor(R.color.main_blue))
    .setAutoCancel(true)
    .setOnlyAlertOnce(true)
    .setGroupSummary(true)
    .setContentIntent(getPendingIntent(DEFAULT_WINDOW // null))
    .setGroup(NOTIFICATION_GROUP_NAME)

本以为通知会按预期工作,但是当通知被弹出并点击时,奇怪的是只去了MainActivity。通过记录日志,确认从Splash接收到intent时alarmType为null。

当你写下你遇到的问题时,你可以看到哪里的问题要好得多。

多次测试的结果发现 ,Group Notification 的执行除了按下 Group area 之外,还发生在点击弹出 Notification 时。