开启掘金成长之旅!这是我参与「掘金日新计划 · 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 时。