创建管理通知渠道

创建 和管理 通知渠道

从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

创建 通知渠道

创建渠道有三个步骤

  1. 使用一个唯一ID,一个用户可见的渠道名称和一个渠道重要性 三个参数构造一个NotificationChannel实例
  2. (可选)设置渠道描述 通过 setDescription();
  3. 通过NotificationManagercreateNotificationChannel()创建渠道

Note: 确保创建代码运行在Android O及以上,因为渠道的API没有在support library中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create the NotificationChannel
CharSequence name = getString(R.string.channel_name);
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, importance);
mChannel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = (NotificationManager) getSystemService(
NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(mChannel);
}

如果创建的渠道已经存在当程序运行的时候不会出现异常

通知的行为默认是通过设置的重要性(构建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 就不能再修改重要性级别了,但是用户可随意随时修改。

有关选择适当优先级的信息 ,查看 通知设计指南中的 正确设置和管理优先级

读取通知渠道设置

用户可以在设置界面设置渠道的行为(震动,声音等)可以通过以下步骤获取到用户对我们渠道的行为设置。

  1. 通过 getNotificationChannel() or getNotificationChannels() 获取NotificationChannel 实例
  2. 查询指定的设置 例如 getSound(),getImportance(),getVibrationPattern()

如果检测到用户设置会影响程序的行为。我们可以给用户一个操作让其改变设置。

打开通知渠道设置

渠道在创建了之后就不能通过代码的方式改变其行为了,只能用户在系统设置修改。为了方便用户修改我们可以通过代码打开系统设置,让用户更方便的修改。

通过Intent使用action:ACTION_CHANNEL_NOTIFICATION_SETTINGS 打开系统设置。
需要两个参数 一个是包名 一个是渠道id。

下面就是打开系统设置渠道的代码。

1
2
3
4
Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
startActivity(intent);

删除通知渠道

可以通过以下代码删除渠道

1
2
3
4
5
NotificationManager 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

坚持原创技术分享,您的支持将鼓励我继续创作!