美文网首页
浅谈通知频道NotificationChannel

浅谈通知频道NotificationChannel

作者: 愈强 | 来源:发表于2020-08-12 15:55 被阅读0次

    从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)。

    回到通知设置页面,我们可以看到页面上的效果已经发生了变化

    通知渠道分组

    相关文章

      网友评论

          本文标题:浅谈通知频道NotificationChannel

          本文链接:https://www.haomeiwen.com/subject/pwppdktx.html