从Android8.0开始,应用显示通知时,必须为通知指定一个ChannelId。我们可以在构造通知的时候看到这个要求:
public class NotificationCompat {
public static class Builder {
public Builder(@NonNull Context context, @NonNull String channelId) {
// ...
}
@Deprecated
public Builder(Context context) {
this(context, null);
}
}
}
之前的构造方法已经被弃用了,新的构造方法要求用户添加channelId参数。
下面我们来看一下ChannelId以及与其相关的知识点。
创建NotificationChannel
一个channelId对应一个NotificationChannel,下面代码展示了如何创建NotificationChannel:
// private static final String NORMAL_CHANNEL_ID = "my_notification_normal";
// private static final String IMPORTANT_CHANNEL_ID = "my_notification_important";
NotificationChannel channel1 = new NotificationChannel(NORMAL_CHANNEL_ID,
"普通通知", NotificationManager.IMPORTANCE_LOW);
channel1.setDescription("这是普通通知,不太重要");
NotificationChannel channel2 = new NotificationChannel(IMPORTANT_CHANNEL_ID,
"重要通知", NotificationManager.IMPORTANCE_HIGH);
channel2.setDescription("这是重要通知,建议开启");
List<NotificationChannel> channels = new ArrayList<>();
channels.add(channel1);
channels.add(channel2);
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannels(channels);
这里定义了两个NotificationChannel。构造方法需要三个参数,ChannelId是自定义的字符串;第二个参数是频道的名称;第三个是优先级。创建完NotificationChannel之后,还需要使用createNotificationChannels方法注册到系统中。
注册之后,就可以使用这个ChannelId去创建通知了。可以针对一个渠道设置通知的声音、振动、优先级等效果。使用该渠道的通知默认使用这些提示行为。
打开应用设置,查看通知权限,会看到我们新创建的通知渠道,名称和简介都有。
通知渠道在系统通知设置中的效果检查通知渠道的设置
创建通知渠道的时候,我们可以指定通知的声音、振动等效果。同时用户也可以在设置页面修改这些设置,并且用户设置的优先级总是更高的。
通知效果设置
可以通过getNotificationChannel获取NotificationChannel,并查看用户修改后的设置。
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = manager.getNotificationChannel(IMPORTANT_CHANNEL_ID);
int importance = channel.getImportance();
Uri uri = channel.getSound();
引导用户修改设置
如果用户修改了的设置,是无法通过代码进行修改的。此时就需要引导用户跳转到设置页面手动进行修改:
Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, IMPORTANT_CHANNEL_ID);
context.startActivity(intent);
对通知渠道进行分组
如果应用支持多个用户,可以把通知按照用户进行分组,不同的用户可以分别管理自己名下的通知状态。(或者按照任何纬度进行分组,请发挥想象力)
下面的代码中,我创建了两个通知组每个组中包含了两个通知渠道:
public static void createNotifications(Context context) {
createAllNotificationChannel(context, "1");
createAllNotificationChannel(context, "2");
}
public static void createAllNotificationChannel(Context context, String groupId) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, "用户" + groupId));
NotificationChannel channel1 = new NotificationChannel(NORMAL_CHANNEL_ID + groupId,
"普通通知", NotificationManager.IMPORTANCE_LOW);
channel1.setDescription("这是普通通知,不太重要");
channel1.setGroup(groupId);
NotificationChannel channel2 = new NotificationChannel(IMPORTANT_CHANNEL_ID + groupId,
"重要通知", NotificationManager.IMPORTANCE_HIGH);
channel2.setDescription("这是重要通知,建议开启");
channel2.setGroup(groupId);
List<NotificationChannel> channels = new ArrayList<>();
channels.add(channel1);
channels.add(channel2);
manager.createNotificationChannels(channels);
}
注意:虽然通知渠道被分到不同的组中了,但是ChannelId仍然要保持唯一(以为创建通知的时候只传入了ChannelId,并没有传递GroupId)。
回到通知设置页面,我们可以看到页面上的效果已经发生了变化
通知渠道分组
网友评论