通知(notification)是Android系统中比较有特色的一个功能,当某个应用希望向用户发出一些提示信息,而该应用又不再前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏上会显示一条通知的图标,下拉状态栏后可以看到通知的详细内容。Android通知功能获得大量用户的认可和喜欢。
一、通知的基本用法
通知的用法还是比较灵活的,既可以在活动里面创建,也可以在广播接收器里面创建,还可以在服务里面创建。相对于广播接收器和服务,在活动里创建通知的场景还是比较少的,因为一般只有当程序进入到后台的时候我们才需要使用通知。
创建通知的步骤:首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService()方法获取到。getSystemService()方法接受一个字符串参数用于确定系统的哪个服务,这里传入Context.NOTIFICATION_SERVICE即可。因此,获取NotificationManager的实例可以写成这样:
NotificationManager manager = (NotificationManager )getSystemService(Context.NOTIFICATION_SERVICE);
接下来需要使用一个Builder构造器来创建Notification对象,使用support-v4库中提供一个NotificationCompat类,使用这个类的构造器来创建Notification对象,就可以保证我们对程序在所有Android系统版本上都能正常工作,代码如下:
Notification notification = new NotificationCompat.Builder(context).build();
我们可以在最终build()方法之前连缀任意多的设置方法来创建一个丰富的Notification对象,先来看一些最基本的设置:
Notification notification = new NotificationCompat.Builder(context)
.setContentTitle("This is content title") //用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。
.setContentText("This is content text") //用于指定通知的正文内容,下拉系统状态栏就可以看到这部分内容。
.setWhen(System.currentTimeMillis()) //用于指定通知被创建的时间,以毫秒为单位,下拉系统状态栏,这里指定的时间会显示在相应的通知上。
.setSmallIcon(R.drawable.small_icon) //用于设置通知的小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon)
.build();
最后只需要调用NotificationManager的notify()方法就可以让通知显示出来。notify()方法有两个参数,第一个参数就是id,要保证为每个通知所指定的id都是不同的。第二个参数则是Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。因此,显示一个通知就可以写成:
manager.notify(1,notification);
二、PendingIntent的基本用法
1、PendingIntent与Intent的区别
他们都可以去指明某一个“意图”,都可以用于启动活动,启动服务以及发送广播等。不同的是,Intent更加倾向于立刻执行某个动作,而PendingIntent更加倾向于在某个 合适的时机去执行某个动作。所以,也可以把PendingIntent简单地理解为延迟执行的Intent。
2、PendingIntent的基本用法
PendingIntent主要提供了几个静态方法用于获取PendingIntent的实例,可以根据需要来选择是使用getActivity()方法、getBroadcast()方法,还是getService()方法。这几个方法所接受的参数都是相同的,第一个参数依旧是Context,第二个参数一般用不到,通常传入0即可。第三个参数是一个Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”。第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT这4种值可选,每种植的具体含义查文档,通常情况下这个参数传入0就可以。
3、核心代码:
Intent intent = new Intent(this,NotificationActivity.lass);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager = (NotificationManager ) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title") //用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。
.setContentText("This is content text") //用于指定通知的正文内容,下拉系统状态栏就可以看到这部分内容。
.setWhen(System.currentTimeMillis()) //用于指定通知被创建的时间,以毫秒为单位,下拉系统状态栏,这里指定的时间会显示在相应的通知上。
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/notification.ogg"))) //音频文件
.setVibrate(new long[]{0,1000,1000,1000}) //设置震动
.setLights(Color.GREEN,1000,1000) //设置LED灯
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setSmallIcon(R.drawable.small_icon) //用于设置通知的小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon)
.setContentIntent(pi)
.build();
manager.notify(1,notification);
4、如何消失通知图标
1)在NotificationCompat.Builder中再连缀一个setAutoCancel()方法
Notification notification = new NotificationCompat.Builder(this)
........
.setAuotoCancel(true)
.build();
可以看到,setAutoCancel()方法传入true,将表示当点击了这个通知的时候,通知会自动取消掉。
2)显示地调用NotificationManager的cancel()方法将它取消
NotificationManager manager = (NotificationManager ) getSystemService(NOTIFICATION_SERVICE);
manager .cancel(1);
5、下面对Notification类中的一些常量,字段,方法简单介绍一下
1)常量:
DEFAULT_ALL 使用所有默认值,比如声音,震动,闪屏等等
DEFAULT_LIGHTS 使用默认闪光提示
DEFAULT_SOUNDS 使用默认提示声音
DEFAULT_VIBRATE 使用默认手机震动
【说明】:加入手机震动,一定要在manifest.xml中加入权限:
<uses-permission android:name="android.permission.VIBRATE" />
以上的效果常量可以叠加,即通过
notification.defaults =DEFAULT_SOUND|DEFAULT_VIBRATE;
notification.defaults |= DEFAULT_SOUND (最好在真机上测试,震动效果模拟器上没有)
2)设置flag位
FLAG_AUTO_CANCEL 该通知能被状态栏的清除按钮给清除掉
FLAG_NO_CLEAR 该通知能被状态栏的清除按钮给清除掉
FLAG_ONGOING_EVENT 通知放置在正在运行
FLAG_INSISTENT 是否一直进行,比如音乐一直播放,知道用户响应
3)常用字段:
contentIntent 设置PendingIntent对象,点击时发送该Intent
defaults 添加默认效果
flags 设置flag位,例如FLAG_NO_CLEAR等
icon 设置图标
sound 设置声音
tickerText 显示在状态栏中的文字
when 发送此通知的时间戳
6、NotificationManager常用方法介绍:
public void cancelAll() 移除所有通知(只是针对当前Context下的Notification)
public void cancel(int id) 移除标记为id的通知 (只是针对当前Context下的所有Notification)
public void notify(String tag ,int id, Notification notification) 将通知加入状态栏,标签为tag,标记为id
public void notify(int id, Notification notification) 将通知加入状态栏,标记为id