14、通知渠道分组:ChannelGroup的创建与管理、按应用模块分组、用户可见的分组名称

通知渠道分组,说白了就是给你的通知渠道“建个文件夹”。

Android 8.0 引入通知渠道后,大家发现一个问题:如果 App 功能模块太多,通知渠道列表会变得又长又乱。用户看着一长串开关,根本不知道哪个是哪个。我当年接手一个电商项目,光推送类型就分了 20 多种,用户反馈说“这 App 通知设置跟天书一样”。嗯,那时候我就意识到——光有渠道还不够,得学会分组。

14.1 为什么需要 ChannelGroup?

你想想看,一个社交 App 可能有这些通知:

  • 私信通知
  • 评论通知
  • 点赞通知
  • 系统通知
  • 活动通知

如果不分组,用户看到的是一堆平铺的开关。如果按“消息通知”、“社交互动”、“系统公告”分组,用户一眼就能找到想调整的模块。这就是 ChannelGroup 的价值——提升用户体验,降低设置门槛

核心要点:ChannelGroup 是通知渠道的逻辑容器。它不会影响通知的发送行为,只影响通知在系统设置界面的展示方式。

14.2 创建 ChannelGroup

创建分组非常简单。你需要一个唯一的 Group ID 和一个用户可见的名称。

// 创建分组
String groupId = "group_social";
CharSequence groupName = "社交互动";

NotificationChannelGroup socialGroup = 
    new NotificationChannelGroup(groupId, groupName);

// 注册到 NotificationManager
NotificationManager notificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannelGroup(socialGroup);

这里有个细节:Group ID 必须唯一,而且一旦创建,不建议修改。我曾在项目中因为重构改了 Group ID,结果旧设备上残留了空分组,用户设置里出现了一个“无渠道的分组”,特别尴尬。

个人习惯:我一般用“模块名_功能”的命名方式,比如 group_order_refund、group_order_delivery。这样一眼就能看出归属。

14.3 将渠道绑定到分组

创建分组后,创建通知渠道时指定分组即可:

NotificationChannel channel = new NotificationChannel(
    "channel_like",
    "点赞通知",
    NotificationManager.IMPORTANCE_DEFAULT
);

// 绑定到分组
channel.setGroup("group_social");

notificationManager.createNotificationChannel(channel);

注意顺序:先创建分组,再创建渠道。如果渠道绑定了不存在的分组,系统会忽略分组设置。我记得有一次调试,渠道死活不显示在分组下,查了半天发现是分组还没创建就绑定了渠道。

避坑指南:我曾经在批量创建渠道时,把分组创建和渠道创建写在了同一个循环里。结果某些渠道先于分组创建,导致分组失效。正确的做法是:先批量创建所有分组,再批量创建所有渠道。

14.4 按应用模块分组的实践

我建议按照 App 的业务模块来划分分组。下面是一个典型电商 App 的分组方案:

Group ID 分组名称(用户可见) 包含渠道
group_order 订单通知 下单成功、发货提醒、物流更新、退款进度
group_promotion 促销活动 限时秒杀、优惠券到账、满减提醒
group_social 社交互动 评论回复、点赞通知、关注提醒
group_system 系统公告 版本更新、安全提醒、隐私政策变更

这样分组后,用户在系统设置里看到的是四个清晰的模块,而不是一长串看不懂的渠道名。用户体验提升非常明显。

14.5 管理 ChannelGroup

除了创建,你还需要知道怎么查询和删除分组:

// 获取所有分组
List<NotificationChannelGroup> groups = 
    notificationManager.getNotificationChannelGroups();

// 获取单个分组(API 26+)
NotificationChannelGroup group = 
    notificationManager.getNotificationChannelGroup("group_social");

// 删除分组(API 26+)
notificationManager.deleteNotificationChannelGroup("group_social");

删除分组时要注意:分组下的所有渠道也会被删除。这个操作不可逆,用户之前对渠道的设置也会丢失。我建议只在 App 版本升级、模块下线等场景下使用,不要轻易调用。

重要提醒:删除分组前,最好先遍历分组下的渠道,给用户一个确认弹窗。或者干脆只做“废弃”处理,不真正删除。

14.6 用户可见的分组名称

分组名称是直接展示给用户看的,所以命名要讲究。我总结了几个原则:

  • 简短明了:控制在 4-6 个字,比如“订单通知”、“系统公告”
  • 避免技术术语:不要用“推送组”、“渠道组”这种词
  • 保持一致性:和 App 内功能模块的名称保持一致
  • 考虑国际化:如果 App 支持多语言,记得在 strings.xml 中配置
<!-- strings.xml -->
<string name="group_order">订单通知</string>
<string name="group_promotion">促销活动</string>
<string name="group_social">社交互动</string>

我个人习惯把分组名称放在 strings.xml 里,而不是硬编码。这样后期改文案、做多语言都方便。

14.7 知识体系图

下面这张图帮你理清 ChannelGroup 的核心逻辑:

ChannelGroup 知识体系 NotificationManager ChannelGroup(分组容器) Channel 1(点赞) Channel 2(评论) Channel 3(关注) 系统设置 → 应用通知 → 社交互动分组 用户看到的不是散落的渠道,而是按分组整理好的模块 分组只影响展示,不影响通知的发送和接收

14.8 总结与建议

ChannelGroup 不是什么高深的技术,但它能显著提升用户体验。我给你的建议是:

  • 尽早规划:在引入通知渠道时,就同步设计分组方案。后期拆分很麻烦。
  • 分组粒度适中:太粗(只有一个分组)没意义,太细(每个渠道一个分组)反而更乱。3-6 个分组比较合理。
  • 测试分组展示:不同厂商的 ROM 对分组的展示方式可能不同,建议在主流机型上测试一下。

嗯,关于 ChannelGroup 的内容就这些。记住一句话:分组是给用户看的,不是给系统看的。站在用户的角度去设计分组,你的通知设置就不会差。


公众号:蓝海资料掘金营,微信deep3321