Android8.0通知栏

Posted by alonealice on 2018-06-29

在日常使用Android手机的过程中,我们经常会遇到被各种通知轰炸的情况。大量的通知,极大的降低了使用体验,同时也将真正有用的信息淹没。虽然手机可以屏蔽这些通知,但是一旦屏蔽,应用里重要的通知也无法再提示,让人进退两难。

面对这种情况,google在Android8.0系统中开始对其进行改进优化。

在Android8.0中,google引入了通知渠道的概念。每个应用都可以创建自己的通知渠道,发送通知时,通知也需要指定相应的渠道。这些通知渠道有用户控制,用户可以对不同的渠道设置不同的重要级,也可以对不同的渠道进行开启和关闭,这样就可以将部分不重要的通知进行屏蔽。

渠道创建

要想使用最新的通知渠道,首先需要将项目的targetSdkVersion大于26,当然,如果你想直接兼容之前版本避免渠道的使用,也可以通过修改targetSdkVersion小于25实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
private val channel1="default"
private val channel2="high"

fun createChannel(v: View){
createChannel(channel1,"默认通道",NotificationManager.IMPORTANCE_DEFAULT)
createChannel(channel2,"高级通道",NotificationManager.IMPORTANCE_HIGH)
}

private fun createChannel(channelId: String,channelName: String,important: Int){
val channel=NotificationChannel(channelId,channelName,important)
val notificationManager=getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}

创建渠道的方式也很简单,指定渠道的id、名字和重要性即可。渠道创建之后会一直存在,并且重复创建时也不会出现重复渠道,直到渠道删除。

1
2
3
val notificationManager=getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.deleteNotificationChannel(channel1)
notificationManager.deleteNotificationChannel(channel2)

渠道创建之后无法修改,用户可以在应用的设置中修改通知,用户一旦修改渠道的重要性后,程序无法再次对其修改,即使删除渠道再创建也不行,除非创建不同id的渠道。

渠道重要性

渠道的重要性主要是6级,IMPORTANCE_DEFAULTIMPORTANCE_HIGHIMPORTANCE_LOW,**IMPORTANCE_MAX, ** IMPORTANCE_MINIMPORTANCE_NONE。但是实际上的重要性是四级。

因此实际上,IMPORTANCE_HIGHIMPORTANCE_MAX对应紧急的重要性,IMPORTANCE_DEFAULT对应的重要性,IMPORTANCE_LOW对应,而IMPORTANCE_NONEIMPORTANCE_MIN对应

重要性一旦被用户手动修改后,程序无法再调整其重要性,除非创建不同的渠道,同时在设置中会显示程序删除的通道数量。

这些重要性分别是怎样的效果呢?

:程序不会有任何视觉和声音的提示,除非用户将整个通知栏滑开才能看到;

:程序不会有声音提示,但是会在通知栏上显示图标;

:程序会有声音提示,并且会在通知栏上提示图标;

紧急:程序会提示声音,并且会直接弹出窗口提示用户;

发送渠道通知

发送通知时需要将通知指定相应的渠道:

1
2
3
4
5
6
7
8
9
10
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val notification = NotificationCompat.Builder(this, channel1)//指定渠道
.setContentTitle("消息标题")
.setContentText("消息内容?")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_background)
.setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.ic_launcher_background))
.setAutoCancel(true)
.build()
manager.notify(1, notification)

用户可以通过优化,对通知设置静默时间,那么在该时间段内,该渠道的通知就都会被屏蔽。

设置数字

Android8.0可以直接在发送通知时设置图标数字

1
2
3
4
val notification = NotificationCompat.Builder(this, channel1)
...
.setNumber(10)
.build()

不过具体到实际的设备中时,很多的设备可以设置是否显示图标数字。