Android 8.0 Notification渠道通知

Android8.0对通知栏进行更改,必须添加渠道信息后才能使用(target版本>=26).那么渠道通知有什么优点和应用场景呢?

在android O系统之前,系统的通知都是不区分类别的,比如,微信的好友消息通知和其他类型的通知,当你对其他类型的通知反感的时候,你也没有任何办法,因为如果把微信的通知关掉的话,微信好友给你发送的信息你也不会弹出通知.但是,在android8.0之后,通知栏进行渠道划分,通知信息可以划分成任意的渠道,比如微信好友消息分为一个渠道,其他类型的消息分为另一个渠道,当我们只想手机弹出好友消息时,可以单独的关闭其他通知的渠道通知.使我们开发的APP更加贴合民意.

Android 8.0 Notification渠道通知_第1张图片

创建渠道

那么如何创建通知渠道呢?so easy

            var channelId = "chat"
            var channelName = "聊天消息"
            var importance = NotificationManager.IMPORTANCE_HIGH
            createNotificationChannel(channelId, channelName, importance)

            channelId = "subscribe"
            channelName = "订阅消息"
            importance = NotificationManager.IMPORTANCE_DEFAULT
            createNotificationChannel(channelId, channelName, importance)

这里我们自建了一个函数,需要三个参数channelId是渠道id,后面根据需要发送通知的类型而区分的渠道id.channelName是渠道的名称,这个参数会显示在通知管理里,第三个参数importance是消息的重要度,我们这里分别传入IMPORTANCE_HIGH和IMPORTANCE_DEFAULT,IMPORTANCE_HIGH的重要程度是要弹出横幅的非常重要,IMPORTANCE_DEFAULT的重要程度是只响声音,并标题栏有图标提示.此外还有IMPORTANCE_LOW,IMPORTANCE_MIN(华为手机对此参数无效果,华为的通知管理中横幅这一开关选项,需要手动的去打开才能弹出横幅.此参数对三星手机有效).

   @TargetApi(Build.VERSION_CODES.O)
    private fun createNotificationChannel(channelId: String, channelName: String, importance: Int) {

        val channel = NotificationChannel(channelId, channelName, importance)
        channel.setShowBadge(true)
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager?.createNotificationChannel(channel)

    }

我们来看一下效果

Android 8.0 Notification渠道通知_第2张图片

发送通知

那么如何向这两个渠道进行发送通知呢?也so easy.我们先弄两个按钮,一个发送消息通知,一个发送订阅通知.按钮的布局文件我就不粘了.

            send_chat.setOnClickListener(View.OnClickListener {
                sendMessageChat()
            })
            subscribe.setOnClickListener(View.OnClickListener {
                sendMessageSubscribe()
            })

 

      fun sendMessageChat() {
        val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        val notification = NotificationCompat.Builder(this, "chat")
            .setContentTitle("好友小Y")
            .setContentText("老铁,干啥呢?晚上整点啊!")
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.icon)
            .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.icon))
            .setAutoCancel(true)
            .setNumber(55)
            .build()
        manager.notify(1, notification)
    }

NotificationCompat.Builder(this, "chat"),这里的第二个参数就是区分给哪一个渠道进行通知, .setContentTitle("好友小Y")是设置通知的标题,.setContentText("老铁,干啥呢?晚上整点啊!")是设置通知的内容,.setSmallIcon(R.drawable.icon)是设置通知里面显示的图片,.setNumber(55)是设置图标右上角有多少未读消息(华为也是不好使,三星好使).

Android 8.0 Notification渠道通知_第3张图片

至此,我们APP中有两条通知渠道,两个按钮分别给两个渠道的通知进行发送通知,如果用户不喜欢接收我们APP的订阅通知,在通知管理中,选择订阅通知进行权限关闭,这样手机就只显示聊天消息.

渠道分组

渠道通知也是可以分组的(还是此功能对华为不好用,但是三星可以显示出来),那么如何进行渠道分组呢?so easy

            createNotifycationGroup("chat", "聊天消息")
            createNotifycationGroup("subs", "通知消息")

这里我创建了一个函数,第一个参数是组id,唯一即可.第二个参数是组的名称,即显示在通知管理中的分组名称.

private fun createNotifycationGroup(groupId: String, groupName: String) {

        val group = NotificationChannelGroup(groupId, groupName)
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager?.createNotificationChannelGroup(group)
        
    }

这样的话,创建渠道的函数也需要更改一下.

    @TargetApi(Build.VERSION_CODES.O)
    private fun createNotificationChannel(channelId: String, group: String, channelName: String, importance: Int) {
        val channel = NotificationChannel(channelId, channelName, importance)
        //在创建通知渠道前,指定渠道组 id
        channel.group = group
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager?.createNotificationChannel(channel)
    }
            var channelId = "chat"
            var channelName = "聊天消息"
            var importance = NotificationManager.IMPORTANCE_HIGH
            createNotificationChannel(channelId,"chat",channelName, importance)

            channelId = "subscribe"
            channelName = "订阅消息"
            importance = NotificationManager.IMPORTANCE_DEFAULT
            createNotificationChannel(channelId,"subs",channelName, importance)

            channelId = "game"
            channelName = "游戏消息"
            importance = NotificationManager.IMPORTANCE_DEFAULT
            createNotificationChannel(channelId,"subs", channelName, importance)

            channelId = "apk"
            channelName = "安装消息"
            importance = NotificationManager.IMPORTANCE_DEFAULT
            createNotificationChannel(channelId, "subs",channelName, importance)

            channelId = "lalala"
            channelName = "不知道啥消息消息"
            importance = NotificationManager.IMPORTANCE_DEFAULT
            createNotificationChannel(channelId, channelName, importance)

添加了一个参数,即将渠道绑定在渠道组id上.华为手机无法演示,那三星的手机看一眼效果.

Android 8.0 Notification渠道通知_第4张图片

 

删除渠道

最后提醒一点,渠道创建和划分好渠道组后,无法进行更改,因为创建渠道通知代码在第一次运行的时候进行创建,往后会检测到渠道后也不会运行创建代码,所以,渠道通知创建要慎重.虽然google提供了删除渠道的代码.

            val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            manager.deleteNotificationChannel("lalala")

但是,APP会留下一道无法抹去的疤痕.

Android 8.0 Notification渠道通知_第5张图片

看图片最下面.

to be continued

 

 

 

 

 

 

 

你可能感兴趣的:(Android 8.0 Notification渠道通知)