Notification很简单,考虑到Android兼容问题,我们需要使用support库中提供的兼容API,NotificationCompat类。下面直接写代码
NotificationManager manager = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(getContext())
.setContentTitle("this is a title")
.setContentText("this is a text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.small_icon)
.setLargeIcon(BitmapFactory.decodeResource(getContext().getResources(),R.drawable.large_icon))
.build();
manager.notify(1,notification);
这个代码很好理解,有一点我需要说明一下,notify()的第一个参数是这个通知的Id,如果你写死了,比如都是1,那么下一个通知来的时候就会把这个通知覆盖掉,如果这个id,你每次都写的不一样,那么你的通知栏就会出现多条通知,不会被覆盖。
我们发送一个通知肯定希望点击通知,该通知消失,然后去执行一个“意图”。我们首先来说说如何点击让通知栏消失。
第一种方法:
NotificationManager manager = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(getContext())
.setContentTitle("this is a title")
.setContentText("this is a text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.small_icon)
.setLargeIcon(BitmapFactory.decodeResource(getContext().getResources(),R.drawable.large_icon))
.setAutoCancel(true)
.build();
manager.notify(1,notification);
第二种方法在你跳转后的Activity的onCreate里写
NotificationManager manager = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(1)
cancel()中传入的1就是通知的ID,传入不同的Id可以取消不同的通知栏。
下面我们讲讲如何点击通知栏,执行一个“意图”,这个时候我们需要用到pendingIntent类,创建它的实例,根据项目需求选择使用:getActivity(),getBroadcast(),getService().这几个方法传入的参数都是相同的,第一个参数是context,第二个参数传入0即可,第三个参数是intent对象,第四个参数是确定pendingIntent的行为,有FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAGE_CANCEL_CURRENT,FLAGE_UPDATE_CURRENT,通常我们传入0即可。然后调用setContentIntent()方法传进去即可。
Intent intent = new Intent(this,NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager = (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(getContext())
.setContentTitle("this is a title")
.setContentText("this is a text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.small_icon)
.setLargeIcon(BitmapFactory.decodeResource(getContext().getResources(),R.drawable.large_icon))
.setContentIntent(pi)
.build();
manager.notify(1,notification);
其实通知还有很多实用的API,比如setSound()方法
setSound(Uri.fromFile(new File("/system/media/audio/ringtones/test.ogg")))
还可以让通知来的时候,让手机振动通知用户。下标0的值表示手机静止的时长,下标为1的值表示手机振动的时长,下标为2的值又表示手机静止的时长,下标3的值表示手机振动的时长,以此类推。比如
setVibrate(new long[]{0,1000,1000,1000})
通知来的时候立即振动1s,然后静止1s,再振动1s.
我们还可以在通知来的时候控制手机的LED手机灯的显示。setLight()方法,第一个参数指定LED灯的颜色,第二个参数指定LED灯亮起的时长,以毫秒为单位,第三个参数用于指定LED灯暗去的时长。如果想实现LED灯一闪一闪的效果,就可以这么写
setLight(Color.GREEN,1000,1000)
当然如果你不想弄那么多复杂的设置,也可以直接使用通知的默认效果
setDefault(NotificationCompat.DEFAULT_ALL);
值得一提的还有一个方法,那就是setStyle()方法,这个方法允许我们构建出复杂的通知内容,也就是说不光可以有文字和图标,还可以包含更多,它接收一个NotificationCompat.Style参数。
如果我们想设置很长的文字,我们就可以用这个方法
.setStyle(new NotificationCompat.BigTextStyle().bigText("kfkjfkdjfjlaldjffj jfkajkjfkda " +
" fjdkjfkjafjkj kdjfka jakfjkdjk k kfjkajfkafj "))
除了显示长文字,我们还可以显示一张大图片
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(
getContext().getResources(),R.drawable.big_image))
最后我们再看一下setPriority()方法,它是用来设置通知的重要程度的。接收一个整型参数,一共有5个常量值可选:PRIORITY_DEFAULT表示默认的重要程度和不设置是一样的;PRIORITY_MIN表示最低的重要程度,系统可能只会在特定的场景才显示这条通知,比如用户下拉状态栏的时候;PRIORITY_LOW表示较低的重要程度,系统可能会将这类通知缩小,会改变其显示的顺序,将其排在更重要的通知之后;PRIORITY_HIGH表示较高的重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在靠前的位置;PRIORITY_MAX表示最高的重要程度,这类通知消息必须让用户立刻看到,甚至需要用户做出相应操作。
setPriority(NotificationCompat.PRIORITY_MAX)
这样状态栏弹出的就不是一个小图标,而是一个横幅,并附带了详细的通知内容,你可以试试看哦。
Notification就讲到这里吧,大家有喜欢的可以顶一下哈,