通知(Notification)⼏乎是每⼀个Android开发者都会⽤到的功能,它可以在应⽤程序暂时不使⽤时提供有关事件的简短的、即时的信息。
Android 8.0 后,通知(Notification)新加⼊了通知渠道(NotificationChannel)和通知渠道组(NotificationChannelGroup)的功能,⽅便开发者管理各种各样的消息通知。下⾯就对Android 8.0 后的通知功能进⾏讲解。
NotificationManager
NotificationManager是⼀个⽤于管理通知的类。通知、通知渠道、通知渠道组均要在通知管理器中“注册”才⽣效。
所以我们⾸先构造⼀个NotificationManager实例出来:
NotificationManager manager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannelGroup
通知渠道组⽤于管理通知渠道,⼀个Group下可以管理多个具有类似属性的通知渠道
NotificationChannelGroup channelGroup =new NotificationChannelGroup("Group1","Group1");
这⾥⾸先调⽤NotificationChannelGroup的构造⽅法,接收两个参数,第⼀个参数是“组ID”,第⼆个参数是“组名”,这两个参数在保证不和其他组的参数重复的情况下⾃拟就好。
然后在NotificationManager中进⾏创建通知渠道组。
NotificationChannel
通知渠道⽤于管理通知,⼀个Channel下管理多个具有类似属性的通知
NotificationChannel notificationChannel =new NotificationChannel("TEST1","TEST1", NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setLightColor(Color.YELLOW);
notificationChannel.setVibrationPattern(new long[]{0,100,100,100});
notificationChannel.setGroup("Group1");
NotificationChannel的构造⽅法接收三个参数,第⼀个参数是“渠道ID”,第⼆个参数是“渠道名”,与通知渠道组⼀样,保证不重复⾃拟即可。第三个参数设置了该渠道下通知的重要程度。
例如:IMPORTANCE_HIGH表⽰当有通知时,该通知会有类似QQ、后台消息那样的顶部下拉框的效果。若为
IMPORTANCE_DEFALUT则⽆此效果,仅仅在通知栏中显⽰。
通知渠道可以设置该渠道下通知所具有的通⽤属性,例如是否允许使⽤LED消息提⽰灯、是否允许振动、设置LED提⽰灯的颜⾊、设置振动的频率、还有设置该渠道属于哪个通知渠道组。更多API请参考⽂末官⽅⽂档。
!
!这⾥需要注意的是每次修改通知渠道中的属性后必须要把APP卸载后再重新安装才能⽣效(望⼤佬解惑)!!
最后在NotificationManager中创建通知渠道。
这⾥还需要注意⼀下,如需使⽤振动还需在AndroidManifest中添加权限信息:
8.0怎么更新<uses-permission name="android.permission.VIBRATE"/>
Notification
说了半天终于到这最关键的东西了。不得不说Android对于Notification的管理真是⼗分清晰,层层递进。
下⾯直接上代码,边看边解释:
Intent intent =new Intent(this, NotificationActivity.class);
PendingIntent pi = Activity(this,0, intent,0);
Notification notification =new NotificationCompat.Builder(this,"TEST1")
.setContentTitle("This is content title")
.setContentText("balabalabalabla")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentIntent(pi)
.setAutoCancel(true)
.build();
先忽略前两⾏,从Notification的构造开始看起
这⾥我们使⽤⼀个NotificationCompat.Builder来构造Notification,为的是能兼容不同的Android版本
Notification.Builder接收两个参数,第⼀个Context就不⽤多说了。第⼆个是该通知所属的通知渠道的渠道ID。⾃从Android 8.0 开始,构建通知必须明确指明该通知所属的渠道。这么⼀来该通知就具有了先前我们在通知渠道中设置的那些通⽤属性了。
这⾥需要注意的是Notification本⾝也能设置在通知渠道中设置的各种属性,但在Android 8.0 之后,在NotificationChannel中可以设置的属性在Notification的设置的话,是不⽣效的,系统会⾸先获取Channel的各种属性,然后给其余未设置的属性指定默认值。也就是说NotificationChannel和Notification共有的属性均需在NotificationChannel中设置,否则不⽣效(注意卸载再安装)。
下⾯来看看Notification特有的属性:
setContentTitle()设置通知的标题、setContentText()设置通知的内容、setWhen()设置通知上显⽰的时间、
setSmallIcon()和setLargeIcon()设置通知上显⽰的图标。
最后调⽤build()完成Notification构造。然后在NotificationManager中“注册”该通知。这⾥需要传⼊⼀个通知ID,保证每⼀个通知的ID不同即可,⾃拟。
现在来看头两⾏的东西,⾸先构建了⼀个Intent对象,显⽰指明跳转的路径。然后再构造⼀个PendingI
ntent对象,这个是专门⽤于通知点击跳转的。接着setContentIntent()传⼊pi完成点击事件监听。setAutoCancel(true)表⽰当点击通知后,通知会⾃动消失。
整个通知的层次结构⼤概如下图,由NotificationManager统⼀管理。
有关通知的更多定制⽅案请参阅Android官⽅⽂档
发布评论