通知(Notification)几乎是每一个Android开发者都会用到的功能,它可以在应用程序暂时不使用时提供有关事件的简短的、即时的信息。
Android 8.0 后,通知(Notification)新加入了通知渠道(NotificationChannel)和通知渠道组(NotificationChannelGroup)的功能,方便开发者管理各种各样的消息通知。下面就对Android 8.0 后的通知功能进行讲解。
NotificationManager是一个用于管理通知的类。通知、通知渠道、通知渠道组均要在通知管理器中“注册”才生效。
所以我们首先构造一个NotificationManager实例出来:
NotificationManager manager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
通知渠道组用于管理通知渠道,一个Group下可以管理多个具有类似属性的通知渠道
NotificationChannelGroup channelGroup = new NotificationChannelGroup("Group1", "Group1");
manager.createNotificationChannelGroup(channelGroup);
这里首先调用NotificationChannelGroup的构造方法,接收两个参数,第一个参数是“组ID”,第二个参数是“组名”,这两个参数在保证不和其他组的参数重复的情况下自拟就好。
然后在NotificationManager中进行创建通知渠道组。
通知渠道用于管理通知,一个Channel下管理多个具有类似属性的通知
NotificationChannel notificationChannel = new NotificationChannel("TEST1", "TEST1", NotificationManager.IMPORTANCE_HIGH);
notificationChannel.enableLights(true);
notificationChannel.enableVibration(true);
notificationChannel.setLightColor(Color.YELLOW);
notificationChannel.setVibrationPattern(new long[]{ 0, 100, 100, 100 });
notificationChannel.setGroup("Group1");
manager.createNotificationChannel(notificationChannel);
NotificationChannel的构造方法接收三个参数,第一个参数是“渠道ID”,第二个参数是“渠道名”,与通知渠道组一样,保证不重复自拟即可。第三个参数设置了该渠道下通知的重要程度。
例如:IMPORTANCE_HIGH表示当有通知时,该通知会有类似QQ、微信后台消息那样的顶部下拉框的效果。若为IMPORTANCE_DEFALUT则无此效果,仅仅在通知栏中显示。
通知渠道可以设置该渠道下通知所具有的通用属性,例如是否允许使用LED消息提示灯、是否允许振动、设置LED提示灯的颜色、设置振动的频率、还有设置该渠道属于哪个通知渠道组。更多API请参考文末官方文档。
!!这里需要注意的是每次修改通知渠道中的属性后必须要把APP卸载后再重新安装才能生效(望大佬解惑)!!
最后在NotificationManager中创建通知渠道。
这里还需要注意一下,如需使用振动还需在AndroidManifest中添加权限信息:
<uses-permission android:name="android.permission.VIBRATE" />
说了半天终于到这最关键的东西了。不得不说Android对于Notification的管理真是十分清晰,层层递进。
下面直接上代码,边看边解释:
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(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();
manager.notify(1, notification);
先忽略前两行,从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对象,显示指明跳转的路径。然后再构造一个PendingIntent对象,这个是专门用于通知点击跳转的。接着setContentIntent()传入pi完成点击事件监听。setAutoCancel(true)表示当点击通知后,通知会自动消失。
整个通知的层次结构大概如下图,由NotificationManager统一管理。
有关通知的更多定制方案请参阅Android官方文档
参考资料:
Android官方文档:https://developer.android.google.cn/training/notify-user/build-notification
《第一行代码(第二版)》郭霖著