Android8.0对通知栏进行更改,必须添加渠道信息后才能使用(target版本>=26).那么渠道通知有什么优点和应用场景呢?
在android O系统之前,系统的通知都是不区分类别的,比如,微信的好友消息通知和其他类型的通知,当你对其他类型的通知反感的时候,你也没有任何办法,因为如果把微信的通知关掉的话,微信好友给你发送的信息你也不会弹出通知.但是,在android8.0之后,通知栏进行渠道划分,通知信息可以划分成任意的渠道,比如微信好友消息分为一个渠道,其他类型的消息分为另一个渠道,当我们只想手机弹出好友消息时,可以单独的关闭其他通知的渠道通知.使我们开发的APP更加贴合民意.
那么如何创建通知渠道呢?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)
}
我们来看一下效果
那么如何向这两个渠道进行发送通知呢?也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)是设置图标右上角有多少未读消息(华为也是不好使,三星好使).
至此,我们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上.华为手机无法演示,那三星的手机看一眼效果.
最后提醒一点,渠道创建和划分好渠道组后,无法进行更改,因为创建渠道通知代码在第一次运行的时候进行创建,往后会检测到渠道后也不会运行创建代码,所以,渠道通知创建要慎重.虽然google提供了删除渠道的代码.
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.deleteNotificationChannel("lalala")
但是,APP会留下一道无法抹去的疤痕.
看图片最下面.