创建 和管理 通知渠道
从Android8.0(API26)开始,所有的通知必须分配一个渠道。每一个渠道,你都可以设置渠道中所有通知的视觉和听觉行为。然后,用户能够随意修改这些设置来决定通知的行为。
视频说明
https://youtu.be/zGIw4MIJn5o
用户能够设置每个App的通知渠道行为

在用户界面渠道显示为 “类别”
渠道创建后就不能更改通知行为了,用户能够完全控制通知的行为,但我们还是可以更改说明和渠道名称
我们可以为每个不同类型的通知创建一个渠道;
如果 target>=26 就必须使用渠道。如果target是在26以下,但是运行在了26及以上了,不要怕,还是会和往常一样,不会抛出异常。
如果 target>=26; 在26及以上运行的时候没有指定一个渠道,通知是不会发出的,系统会记录此错误。可以在logcat看到
Android O 有一个新的开发者设置,当发送了没有指定渠道的通知时显示一个toast。 Settings > Developer options and enable Show notification channel warnings
创建 通知渠道
创建渠道有三个步骤
- 使用一个唯一ID,一个用户可见的渠道名称和一个渠道重要性 三个参数构造一个
NotificationChannel实例 - (可选)设置渠道描述 通过 setDescription();
- 通过
NotificationManager的createNotificationChannel()创建渠道
Note: 确保创建代码运行在Android O及以上,因为渠道的API没有在support library中
1 |
|
如果创建的渠道已经存在当程序运行的时候不会出现异常
通知的行为默认是通过设置的重要性(构建Channel实例的第三个参数)来决定的。这些参数来自于NotificationManagerCompat中的几个常量。
如果想更进一步的自定行为可以参考以下方法 ;行为在渠道创建后是不能修改的,用户能够完全控制这些设置。
- 指示灯是否开启
enableLights() - 指示灯的颜色
setLightColor() - 设置震动模式
setVibrationPattern()
可以通过 createNotificationChannel() 创建多个渠道;
除了给通知添加渠道,还可以考虑为通知添加系统类型。参考:https://developer.android.google.cn/training/notify-user/build-notification.html#system-category
设置重要性级别
渠道重要性决定了渠道中所有的通知打断级别,必须在渠道构造方法中设置重要性级别。有五个重要性级别 从IMPORTANCE_NONE(0) 到 IMPORTANCE_HIGH(4),我们可以将他们指定给渠道中的所有通知。
为了兼容Android O 以下的版本 必须为通知设置优先级setPriority() 。参数是 NotificationCompat中的几个常量
重要性级别和优先级常量映射到的用户可见的重要性选项如下
| 用户可见的重要性级别 | 重要性级别(Android O及以上) | 优先级(Android O 以下) |
|---|---|---|
| 紧急。发出声音并显示为单条通知 | IMPORTANCE_HIGH | PRIORITY_HIGH or PRIORITY_MAX |
| 高。发出声音 | IMPORTANCE_DEFAULT | PRIORITY_DEFAULT |
| 中。没有声音 | IMPORTANCE_LOW | PRIORITY_LOW |
| 低。没有声音也不会出现在状态栏中 | IMPORTANCE_MIN | PRIORITY_MIN |
所有的通知,不管重要性如何,都会出现在不影响用户的系统界面上。例如通知栏,启动图标的通知点(可以改变样式或是否显示)
一但将渠道提交到NotificationManager 就不能再修改重要性级别了,但是用户可随意随时修改。
有关选择适当优先级的信息 ,查看 通知设计指南中的 正确设置和管理优先级
读取通知渠道设置
用户可以在设置界面设置渠道的行为(震动,声音等)可以通过以下步骤获取到用户对我们渠道的行为设置。
- 通过
getNotificationChannel()orgetNotificationChannels()获取NotificationChannel实例 - 查询指定的设置 例如
getSound(),getImportance(),getVibrationPattern()
如果检测到用户设置会影响程序的行为。我们可以给用户一个操作让其改变设置。
打开通知渠道设置
渠道在创建了之后就不能通过代码的方式改变其行为了,只能用户在系统设置修改。为了方便用户修改我们可以通过代码打开系统设置,让用户更方便的修改。
通过Intent使用action:ACTION_CHANNEL_NOTIFICATION_SETTINGS 打开系统设置。
需要两个参数 一个是包名 一个是渠道id。
下面就是打开系统设置渠道的代码。
1 | Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); |
删除通知渠道
可以通过以下代码删除渠道1
2
3
4
5NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
mNotificationManager.deleteNotificationChannel(id);
系统设置会显示已经删除的渠道数量,作为垃圾邮件防范机制。可以通过重装程序或者清楚数据来清除测试渠道
创建渠道分组
如果想要更好的在系统设置UI中显示渠道外观,可以创建渠道分组。当你的APP支持多用户的时候可以为每个账户创建一个渠道分组。这样,用户可以轻易的识别和控制具有相同名字的渠道。
例如,一个网络社交APP可能包含支持个人和工作账户,这种情况下,每个账户可能需要多个相同功能和名称的多个渠道,如下所示:
- 个人账户的两个渠道
- 新评论
- 发布推荐
- 工作账号的两个渠道
- 新评论
- 发布推荐
将每个账户的渠道分组确保用户能够轻易的区分它们。
每一个渠道分组都需要一个包内唯一的ID和一个用户可见的名称,下面代码演示怎么创建一个分组1
2
3
4
5
6
7// The id of the group.
String groupId = "my_group_01";
// The user-visible name of the group.
CharSequence groupName = getString(R.string.group_name);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(group_id, group_name));
创建分组后可以通过渠道的setGroup()来关联分组;
将渠道提交到通知管理后就无法改变关联关系了。
end