从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
创建渠道有三个步骤
NotificationChannel
实例NotificationManager
的 createNotificationChannel()
创建渠道Note: 确保创建代码运行在Android O及以上,因为渠道的API没有在support library中
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
就不能再修改重要性级别了,但是用户可随意随时修改。
有关选择适当优先级的信息 ,查看 通知设计指南中的 正确设置和管理优先级
用户可以在设置界面设置渠道的行为(震动,声音等)可以通过以下步骤获取到用户对我们渠道的行为设置。
getNotificationChannel()
or getNotificationChannels()
获取NotificationChannel
实例getSound()
,getImportance()
,getVibrationPattern()
如果检测到用户设置会影响程序的行为。我们可以给用户一个操作让其改变设置。
渠道在创建了之后就不能通过代码的方式改变其行为了,只能用户在系统设置修改。为了方便用户修改我们可以通过代码打开系统设置,让用户更方便的修改。
通过Intent使用action:ACTION_CHANNEL_NOTIFICATION_SETTINGS
打开系统设置。
需要两个参数 一个是包名 一个是渠道id。
下面就是打开系统设置渠道的代码。
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);
可以通过以下代码删除渠道
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
mNotificationManager.deleteNotificationChannel(id);
系统设置会显示已经删除的渠道数量,作为垃圾邮件防范机制。可以通过重装程序或者清楚数据来清除测试渠道
如果想要更好的在系统设置UI中显示渠道外观,可以创建渠道分组。当你的APP支持多用户的时候可以为每个账户创建一个渠道分组。这样,用户可以轻易的识别和控制具有相同名字的渠道。
例如,一个网络社交APP可能包含支持个人和工作账户,这种情况下,每个账户可能需要多个相同功能和名称的多个渠道,如下所示:
每一个渠道分组都需要一个包内唯一的ID和一个用户可见的名称,下面代码演示怎么创建一个分组
// 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