1.获取通知管理器
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
2.创建通知渠道(NotificationChannel) 如果是8.0以上系统的话
因为NotificationChannel是8.0的新特性,因此在创建通知渠道之前需要确保当前手机版本是大于8.0的
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
initChannels();
}
然后通过调用自定义方法createNotificationChannel()创建了两个渠道
@TargetApi(Build.VERSION_CODES.O)
private void initChannels(){
String channelId = "chat";
String channelName = "聊天消息";
int importance = NotificationManager.IMPORTANCE_HIGH;
createNotificationChannel(channelId,channelName,importance);
channelId = "subscribe";
channelName = "订阅消息";
importance = NotificationManager.IMPORTANCE_DEFAULT;
createNotificationChannel(channelId,channelName,importance);
}
自定义的createNotificationCannel()方法接收三个参数,分别是:渠道ID,渠道名称,重要程度。其中渠道ID可以随便定义,只要保证全局唯一性就可以。渠道名称是给用户看的,需要能够表达清楚这个渠道的用途。重要等级的不同则会决定通知的不同行为。
@TargetApi(Build.VERSION_CODES.O)
private void createNotificationChannel(String channelId,String channelName,int importance){
NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);
notificationManager.createNotificationChannel(channel);
}
3.创建一条通知
Notification notification = new NotificationCompat.Builder(this,"chat")
.setContentTitle("聊天标题")
.setContentText("聊天内容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_round)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_round))
.setAutoCancel(true)
.build();
其中Builder的构造器接收两个参数,第一个参数为Context,第二个参数为渠道ID。setSmallIcon()方法用于设置通知的小图标,注意只能使用纯alpha图层的图片进行设置,小图标会显示在系统状态栏上。setLargeIcon()方法用于设置通知的大图标,当下拉系统状态栏时,就可以看见设置的大图标了。setAutoCancel()方法可以让我们点击该通知后自动取消。
4.最后发送通知
notificationManager.notify(1,notification);
其中第一个参数是ID,要保证每个通知所指定的ID都是不同的。
1.使用PendingIntent进行跳转,先获取PendingIntent的实例
Intent intent = new Intent(this,NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
这里获取PendingIntent实例的方法不只getActivity()一种,还有getBroadcast()和getService()。从名字上也可以看出,它们的区别在于跳转的结果不一样:分别跳转到活动,广播和服务。获取实例的静态方法接收的四个参数分别是:Context,请求码,Intent,Flag。(有关参数的讲解我单独写到下一篇文章中)
2.在Notification的构造器中setContentIntent
.setContentIntent(pi)
PS:如果没有设置ContentIntent的话,之前设置的自动取消(setAutoCancel(true))方法会失效。
1.设置提示音
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/World.ogg")))
2.设置振动提醒
.setVibrate(new long[]{0,1000,0,1000})
下标为0的值表示静止时长,下标为1的值表示手机振动时长,下标为2的值又表示静止时长,以此类推。
PS:手机振动需要在AndroidManifest.xml文件中配置权限
3.设置手机前置LED灯闪烁
.setLights(Color.GREEN,1000,1000)
其中第一个参数为LED灯的颜色,第二个参数为LED灯亮起的时长,以毫秒为单位,第三个参数为LED灯暗去的时长,以毫秒为单位。
4.通用默认设置
.setDefaults(NotificationCompat.DEFAULT_ALL)
5.设置长文本内容
.setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to build notifications,send and sync data,and use voice actions." +
"Get the official Android IDE and developer tools to build apps for Android."))
6.设置大图片
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big_image)))
7.设置通知的重要程度
.setPriority(NotificationCompat.PRIORITY_MAX)
该方法一共有5个常量值可选:
PRIORITY_DEFAULT表示默认的重要程度,和不设置效果一样;
PRIORITY_MIN表示最低重要程度,系统可能只会在特定场景下才显示这条通知,比如下拉状态栏的时候;
PRIORITY_LOW表示较低重要程度,系统可能会将这类通知缩小,或者改变其显示的顺序,将其排在后面;
PRIORITY_HIGH表示较高重要程度,系统可能会将这类通知放大,或者改变其显示的顺序,将其排在前面;
PRIORITY_MAX表示最高重要程度,系统会让用户立刻看到。(横幅)
前面只提及了通知渠道的创建,关于通知渠道其实我们还可以读取它们的状态。
1.获取某个通知渠道
NotificationChannel chatChannel = notificationManager.getNotificationChannel("chat");
这里接收的参数即为channelId,也就是我们创建通知渠道时传入的第一个参数。
2.读取通知渠道的状态
读取状态十分简单,通常都是get方法,比如读取ID值:
chatChannel.getId();
读取渠道名称:
chatChannel.getName();
读取重要程度:
chatChannel.getImportance();
1.在创建通知渠道时,调用了NotificationChannel的setShowBadge(true)方法
@TargetApi(Build.VERSION_CODES.O)
private void createNotificationChannel(String channelId,String channelName,int importance){
NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);
channel.setShowBadge(true);
notificationManager.createNotificationChannel(channel);
}
2.在创建通知时,调用了setNumber()方法,并传入未读消息的数量
.setNumber(2)
PS:即使我们没有调用setShowBadge(true)方法,Android系统默认也是会显示角标的,但是如果你想禁用角标功能,那么记得一定要调用setShowBadge(false)方法。