通知Notification的简单使用
均属于笔记,仅供个人参考,有问题欢迎指正,整理模式
一,通知的基本应用
通知的用法还是比较灵活的,既可以在活动里创建,也可以在广播接收器里创建,当然还可以在服务里创建。相比于广播接收器和服务,在活动里创建通知的场景还是比较少的,因为一般只有当程序进入到后台的时候我们才需要使用通知。
1,获取通知管理器
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
2,创建通知对象
Notification notification = new Notification(R.drawable.icon, "This is ticker text",System.currentTimeMillis());
Notification 的有参构造函数接收三个参数,第一个参数用于指定通知的图标,比如项目的res/drawable 目录下有一张icon.png 图片,那么这里就可以传入R.drawable.icon。第二个参数用于指定通知的ticker 内容,当通知刚被创建的时候,它会在系统的状态栏一闪而过,属于一种瞬时的提示信息。第三个参数用于指定通知被创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。
3,设置通知的布局
notification.setLatestEventInfo(context, "This is content title", "This iscontent text", null);
这个方法接收四个参数,第一个参数是Context,这个没什么好解释的。第二个参数用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。第三个参数用于指定通知的正文内容,同样下拉系统状态栏就可以看到这部分内容。第四个参数是一个PendingIntent对象,这里我们暂时还用不到,可以先传入null。
4,发布通知
manager.notify(1, notification);
notify()方法接收两个参数,第一个参数是id,要保证为每个通知所指定的id 都是不同的。第二个参数则是Notification 对象,这里直接将我们刚刚创建好的Notification 对象传入即可。
二,不同版本的构建方式:
在不同的版本下Notification使用有一些不同,涉及到改成Builder的使用,现在网上大多数资料还是API Level 11版本前的用法介绍,如果不熟悉的话,会绕一些弯路。
现在总结如下,希望对以后使用的程序员有所帮助。
1,低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。前面的有关属性设置这里就不再提了,网上资料很多。
Intent intent = new Intent(this,MainActivity);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
notification.setLatestEventInfo(context, title, message, pendingIntent);
manager.notify(id, notification);
2,高于API Level 11,低于API Level 16 (Android 4.1.2)版本的系统中,可使用Notification.Builder来构造函数。但要使用getNotification()来使notification实现。此时,前面版本在notification中设置的Flags,icon等属性都已经无效,要在builder里面设置。
Notification.Builder builder = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("title")
.setContentText("describe")
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setWhen(System.currentTimeMillis())
.setOngoing(true);
notification=builder.getNotification();
3,高于API Level 16的版本,就可以用Builder和build()函数来配套的方便使用notification了。
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("title")
.setContentText("describe")
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setWhen(System.currentTimeMillis())
.build();
4,注意点
在构造notification的时候有很多种写法,但是要注意,用Notification notification = new Notification();这种构建方法的时候,一定要加上notification.icon这个设置,不然,程序虽然不会报错,但是会没有效果。
三,PendingIntent的介绍
PendingIntent 从名字上看起来就和Intent 有些类似,它们之间也确实存在着不少共同点。比如它们都可以去指明某一个“意图”,都可以用于启动活动、启动服务以及发送广播等。不同的是,Intent 更加倾向于去立即执行某个动作,而PendingIntent 更加倾向于在某个合适的时机去执行某个动作。所以,也可以把PendingIntent 简单地理解为延迟执行的Intent。
获取的方法:
public static PendingIntent getActivity(Context context, int requestCode,Intent intent, int flags)
public static PendingIntent getBroadcast(Context context, int requestCodeIntent intent, int flags)
public static PendingIntent getService(Context context, int requestCode,Intent intent, int flags)
参数介绍:
PendingIntent 的用法同样很简单,它主要提供了几个静态方法用于获取PendingIntent 的实例,可以根据需求来选择是使用getActivity()方法、getBroadcast()方法、还是getService()方法。这几个方法所接收的参数都是相同的,第一个参数依旧是Context,不用多做解释。第二个参数一般用不到,通常都是传入0 即可。第三个参数是一个Intent 对象,我们可以通过这个对象构建出PendingIntent 的“意图”。第四个参数用于确定PendingIntent 的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和FLAG_UPDATE_CURRENT 这四种值可选。
FLAG_ONE_SHOT:利用 FLAG_ONE_SHOT获取的PendingIntent只能使用一次,即使再次利用上面三个方法重新获取,再使用PendingIntent也将失败。
FLAG_NO_CREATE:利用FLAG_NO_CREAT获取的PendingIntent,若描述的Intent不存在则返回NULL值.
FLAG_CANCEL_CURRENT:如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的。你可用使用它去检索新的Intent,如果你只是想改变Intent中的额外数据的话。通过取消先前的Intent,可用确保只有最新的实体可用启动它。
FLAG_UPDATE_CURRENT:最经常使用的是FLAG_UPDATE_CURRENT,因为描述的Intent有 更新的时候需要用到这个flag去更新你的描述,否则组件在下次事件发生或时间到达的时候extras永远是第一次Intent的extras。
此外还需要注意参数: int requestCode :对于FLAG_UPDATE_CURRENT,如果上面的requestCode 为常量,则对于先后出现的若干Notification,则所有对应的Intent里面的extra被更新为最新的,就是全部同一为最后一次的。相反,如果requestCode 每次不一样,则里面的Inent的数据没被更新。
例如:
FLAG_UPDATE_CURRENT会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的Intent中putExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的Intent中putExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了
第一个的内容当使用FLAG_CANCEL_CURRENT时:
依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。
导致上面两个问题的原因就在于第二个参数requestCode,当requestCode值一样时,后面的就会对之前的消息起作用,所以为了避免影响之前的消息,requestCode每次要设置不同的内容。
参考:http://blog.sina.com.cn/s/blog_5da93c8f01011w5j.html
http://blog.csdn.net/bdmh/article/details/41804695
四,通知的高级技巧
可以在通知到来的时候使用音乐、震动和LED显示灯提醒用户。常用的个人感觉还是震动
1,使用音频
先来看看sound这个属性吧,它可以在通知发出的时候播放一段音频,这样就能够更好地告知用户有通知到来。sound 这个属性是一个Uri 对象,所以在指定音频文件的时候还需要先获取到音频文件对应的URI。比如说,我们手机的/system/media/audio/ringtones 目录下有一个Basic_tone.ogg音频文件,那么在代码中这样就可以这样指定:
Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/Basic_tone.ogg"));
notification.sound = soundUri;
2,使用振动
在通知到来的时候让手机进行振动,使用的是vibrate这个属性。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为0 的值表示手机静止的时长,下标为1 的值表示手机振动的时长,下标为2 的值又表示手机静止的时长,以此类推。所以,如果想要让手机在通知到来的时候立刻振动1 秒,然后静止1 秒,再振动1 秒,代码就可以写成:
long[] vibrates = {0, 1000, 1000, 1000};
notification.vibrate = vibrates;
不过,想要控制手机振动还需要声明权限的。因此,我们还得编辑AndroidManifest.xml文件,加入如下声明:
<uses-permission android:name="android.permission.VIBRATE" />
3,使用LED灯
现在的手机基本上都会前置一个LED 灯,当有未接电话或未读短信,而此时手机又处于锁屏状态时,LED 灯就会不停地闪烁,提醒用户去查看。我们可以使用ledARGB、ledOnMS、ledOffMS 以及flags 这几个属性来实现这种效果。ledARGB 用于控制LED 灯的颜色,一般有红绿蓝三种颜色可选。ledOnMS 用于指定LED 灯亮起的时长,以毫秒为单位。ledOffMS用于指定LED 灯暗去的时长,也是以毫秒为单位。flags 可用于指定通知的一些行为,其中就包括显示LED 灯这一选项。所以,当通知到来时,如果想要实现LED 灯以绿色的灯光一闪一闪的效果,就可以写成:
notification.ledARGB = Color.GREEN;
notification.ledOnMS = 1000;
notification.ledOffMS = 1000;
notification.flags = Notification.FLAG_SHOW_LIGHTS;
当然,如果你不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声,以及如何振动,写法如下:
notification.defaults = Notification.DEFAULT_ALL;