通知(Notification)是Android系统中比较有特色的的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现.发出一条通知后,手机最上方的状态栏会显示出一个通知的图标,下拉状态栏后可以看到通知的详细内容.
创建通知的步骤
首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService()方法获取到
接下来需要使用一个Builder构造器来创建Notification对象,考虑到兼容性问题,我们使用support库中提供的兼容API.support-v4库中提供了一个NotificationCompat类,使用这个类的构造器来创建Notification对象,就可以保证我们的程序在所有Android系统版本上都能正常工作了.
最后需要调用NotificationManager的notify()方法就可以让通知显示出来了.
//1.获取通知管理器
NotificationManager manager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//2.实例化通知栏构造器 Notification notification= new NotificationCompat.Builder(MainActivity.this).setContentTitle("This is content title") .setContentText(" 学习如何去新建一个通知,发送并同步数据,并且运动声音震动,获取安卓官方IDE,和发展着工具去新建app给安卓").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)).setContentIntent(pendingIntent). setAutoCancel(true).setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Lua.ogg"))). setVibrate(new long[]{0,1000,1000,1000}).setLights(Color.GREEN,1000,1000) .setStyle(new NotificationCompat.BigTextStyle().bigText("学习如何去新建一个通知,发送并同步数据,并且运动声音震动,获取安卓官方IDE,和发展着工具去新建app给安卓")). setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background))).setPriority(NotificationCompat.PRIORITY_MAX).build();
manager.notify(1,notification);
notification的设置方法有
setContentTitle
setContentText
setWhen
setSmallIcon
setLargeIcon
想要实现通知的点击效果,还需要在代码中进行相应的设置,------------PendingIntent
可以把PendingIntent简单的理解为延迟执行的Intent.
PendingIntent用法:
其提供了几个静态方法用于获取PendingIntent的实例,根据需求来选择是使用getActivity(),getBroadcast(),getService()方法,这个方法中第一个参数是Context,第二个参数一般用不到我们通常传入0即可,第三个参数是一个Intent对象,我们可以通过这个对象构造出PendingIntent的"意图",第四个参数用于确定PendingIntent的行为
NotificationCompat.Builder这个构造器还可以再连缀一个setContentIntent()方法,接收的参数正式一个PendingIntent对象.
相应的代码是
Intent intent=new Intent(MainActivity.this,NotificationActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(MainActivity.this,0,intent,0);
//1.获取通知管理器 NotificationManager manager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//2.实例化通知栏构造器 Notification notification= new NotificationCompat.Builder(MainActivity.this).setContentTitle("This is content title") .setContentText(" 学习如何去新建一个通知,发送并同步数据,并且运动声音震动,获取安卓官方IDE,和发展着工具去新建app给安卓").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)).setContentIntent(pendingIntent). setAutoCancel(true).setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Lua.ogg"))). setVibrate(new long[]{0,1000,1000,1000}).setLights(Color.GREEN,1000,1000) .setStyle(new NotificationCompat.BigTextStyle().bigText("学习如何去新建一个通知,发送并同步数据,并且运动声音震动,获取安卓官方IDE,和发展着工具去新建app给安卓")). setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background))).setPriority(NotificationCompat.PRIORITY_MAX).build(); manager.notify(1,notification);
先使用Intent表达出我们想要启动NotificationActivity的"意图",
将构建好的Intent对象传入到PendingIntent的getActivity()方法中,以得到PendingIntent的实例,
接着在NotificationCompat.Bulider中调用setContentIntent()方法,把它作为参数传入即可.
系统状态上的通知图标消失的方法:(推介使用第一种方法)
一种是在NotificationCompat.Builder中再连缀一个setAutoCancel()方法
一种是显式的调用NotificationManager的cancel()方法将它取消.(其中cancel方法中传入的是创建通知的时候给每条通知指定的id)
通知的进阶
NotificationCompat.Builder中提供了丰富的Api来让我们创造出更多的丰富的通知效果
setSound():可以在通知发出时播放一段音频,这样就能更好的告知用户有通知来,该方法接收一个Uri参数,比如每个手机的/system/media/audio/ringtones目录下都有很多的音频文件.我们可以随便选用一个,在代码中我们可以这样指定:
setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
setVibrate():可以在来通知时让手机震动.该方法接收一个长整型数组.下标为偶数的值表示手机静止的时长,下标为奇数的值表示手机震动的时长.比如如果想要手机在来通知的时候立刻震动1秒然后静止1秒然后再震动1秒代码可以写成:
setVibrate(new long[]{0,1000,1000,1000}).
注意:想要控制手机的震动还需要声明权限,即在AndroidManifest.xml文件中加入权限声明
setLights():实现当有未接电话或短信,而此时手机又处于锁屏状态,LED灯会不停的闪烁来提醒用户去查看.该方法接收三个参数,第一个参数用于指定LED灯的颜色,第二个参数用于指定LED灯亮起得时长,第三个参数指定LED灯暗去的时长,都是以毫秒为单位.当通知来临时,如果想要实现LED灯以绿色的灯光一闪一闪的效果,可以写成
setLights(Color.GREEN,1000,1000)
如果不想要那么多繁杂的设置,也可以直接使用通知的默认效果,根据当前手机的环境来决定播放什么铃声以及如何震动.
setDefaults(NotificationCompat.DEFAULT_ALL)
通知的高级功能
setStyle()方法:允许我们构造富文本通知内容 该方法接收一个NotificationCompat.Style参数,这个参数就是用来构造具体的富文本消息的,如长文字,图片等
如果通知中显示一段长文字,通过setStyle()方法便可以实现这个功能(一般的setContentText是无法做到显示一段长文字的,它会出现很多的省略号).
具体代码如下:
setStyle(new NotificationCompat.BigTextStyle().bigText("学习如何去新建一个通知,发送并同步数据,并且运动声音震动,获取安卓官方IDE,和发展着工具去新建app给安卓")) 在setStyle()方法中创建了一个NotificationCompat.BigTextStyle对象这个对象就是用来封装长文字信息的,我们调用它的bigText()方法并将文字内容传入便可以了.
在通知中显示大照片:setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background)))在setStyle()方法中创建了一个NotificationCompat.BigPictureStyle对象这个对象就是用来设置大照片的,然后调用bigPicture()方法将图片放入即可.通过BitmapFactory的decodeResource()方法将图片解析为Bitmap对象再传入bigPicture()方法中就可以了.
setPriority():它可以用于设置通知的重要程度,该方法接收一个整形参数用于设置这条通知的重要程度,一共有五个值可以供选择:
PRIORITY_DEFAULT表示默认的程度,和不设置效果是一样的
,PRIORITY_MIN,最低的程度,系统只有在特定的场景才会显示这条通知,比如用户下拉状态栏时
PRIORITY_LOW,较低的重要程度,系统可能将这类通知缩小,或改变其电视的顺序,将其排在比较靠后的位置
PRIORITY_HIGH,较高的重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置.
PRIORITY_MAX.较高的重要程度,这类通知消息会让用户立刻看到,甚至需要用户做出响应操作.(使用这类通知的时候要注意,不要让用户感到不爽,不然卸载了你!!)
代码如下:setPriority(NotificationCompat.PRIORITY_MAX)