Notification的使用详解
1、创建一个NotificationManager对象
NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//通知时通过系统服务来管理通知内容,因此要获取系统服务
2、创建Notification对象
Notification notification = new Notification.Builder(this)
.setContentTitle("title") //通知标题栏
.setContentText("text") //通知栏的内容
.setWhen(System.currentTimeMills()) //设置时间,默认为系统发出的时间,一般不需要设置
.setSmallIcon(R.mipmap.ic_launch) //设置通知栏的小图标
.setLargeIcon(R.mipmap.ic_launch) //设置通知栏的大图标
.setTicker("ticker") //设置状态栏的提示内容
.setChannelId(Channel) //设置channelId 以解决适配问题
.setContentIntent(pengdingIntent) //设置通知栏点击即执行的意图,与Intent作用类似,但写法不同
.setPriority(NotificationCompat.PRIORITY_DEFAULT) //设置优先级
.setSytle() //下文会讲解
.setAutoCancel(true) //设置自动取消
.build(); //创建一个notification
mManager.notify(0, notification); //notify 通知,通过通知管理器让通知发出并显示出来
3、PengdingIntent的用法
//例:通过PendingIntent进行通知点击跳转功能。
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,XXX.class), 0);
用法使用说明:
(1)通过getActivity(),getBroadcast(),getService()方法获取实例;
(2)参数为(Context , requestcode, Intent, flag)
requestcode一般用不到,通常设置为0;
flag表示为有:
FLAG_ONE_SHOT //表示这个意图只可以使用一次,后续的通知单击后无法打开
FLAG_NO_CREATE //发现已经存在时,忽略新的请求,继续使用老的,日常开发中很少使用
FLAG_CANCEL_CURRENT //如果新请求的PendingIntent发现已经存在时,取消已经存在的,用新的替换老的
FLAG_UPDATE_CURRENT //如果新情求的PendingIntent发现已经存在时,如果Intent有字段改变了,就更新已存在的PendingIntent
4、在跳转后的Activity中通知取消
(1)设置自动取消
.setAutoCancel(true) //设置自动取消
.build(); //创建一个notification
(2)在跳转后的Activity
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(0);
其中,cancel传入的0,是我们创建Notification中指定的通知ID。
5、通知进阶
(1)解决文字过长一行无法显示完整问题
当使用setContext时,内容为很长的字符串,内容无法再一行显示完整,为了解决这个问题,我们使用setStyle()这个方法
.setStyle(new Notification.BigTextStyle.bigText("这样就能解决文字过长的问题了"))
NotificationCompat.BigTextStyle这个对象就是用于封装长文本信息的,调用它的bigText()方法将文字传入就行
(2)设置带有图片的信息
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)))
这就是通知内加入图片的调用方法
(3)设置通知的重要程度
.setPriority(Notification.PRIORITY_MAX)
PRIORITY_DEFAULT:表示默认重要程度,和不设置效果一样
PRIORITY_MIN:表示最低的重要程度。系统只会在用户下拉状态栏的时候才会显示
PRIORITY_LOW:表示较低的重要性,系统会将这类通知缩小,或者改变显示的顺序,将排在更重要的通知之后。
PRIORITY_HIGH:表示较高的重要程度,系统可能会将这类通知方法,或改变显示顺序,比较靠前
PRIORITY_MAX:最重要的程度, 会弹出一个单独消息框,让用户做出相应。
另外还有一些其他的方法,诸如setOngoning(boolean) 点击或者侧滑通知,通知是否会消失,一般利用它都是设置一个正在运行的通知,如音乐播放或者下载进度等一些特殊的场景,要设置成true
setDefaults(Notification.DEFAULT_VIBRATE) 给通知添加声音,闪灯和震动效果,可以组合使用,具体参数为
//Notification.DEFAULT_VIBRATE 添加默认震动提醒
//Notification.DEFAULT_SOUND 添加默认声音提醒
//Notification.DEFAULT_LIGHTS 添加默认三色灯提醒
//Notification.DEFAULT_ALL 添加默认以上3种全部提醒
6、适配
如果App的targetSDKVersion>=26,没有设置channel通知渠道的话,就会导致通知无法展示。
Android O 引入了 通知渠道(Notification Channels),以提供统一的系统来帮助用户管理通知,如果是针对 android O 为目标平台时,必须实现一个或者多个通知渠道,以向用户显示通知。比如聊天软件,为每个聊天组设置一个通知渠道,指定特定声音、灯光等配置。
解决方案:
NotificationChannel channel = new NotificationChannel(1,"channel_name",NotificationManager.IMPORTANCE_HIGH);
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
//另外在Build构造器中添加.setChannelId("1")
做完这些通知才能够正常弹出。