一、通知的主要功能
显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信等),此类消息一般有多条时会采用摘要的形式显示,展开则显示通知详情;
显示客户端的推送消息(如新版本发布,广告,推荐新闻等)
显示正在进行的事物,一般在通知中显示进度条,显示后台程序运行进度(如音乐播放器、新版本下载进度等)
二、通知简介
基本布局:
普通视图的通知
BigView视图的通知(此类通知需要通过setStyle属性设置,摘要区可以添加自定义的操作)
相关类:使用通知的时候主要涉及两个类:Notification 和 NotificationManager(一般为了拓宽通知的适用范围,推荐使用支持库中的通知类NotificationCompat和NotificationCompat.Builder)
Notification :通知类,该类中包含通知的各种属性和方法;一般通过NotificationCompat.Builder设置通知的各个属性值
NotificationManager:状态栏通知管理类,该类负责应用中所有通知的发送、清除等管理操作;该类是一个系统服务,需要通过 (NotificationManager)getSystemService(NOTIFICATION_SERVICE)方法获得;
三、通知的使用流程
通过NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)获得一个通知的Builder对象;
调用mBuilder的方法设置通知属性,如setSmallIcon(int drawable)、satContentTitle(CharSquence title)等为通知设置小图标、内容标题;
通过mBuilder.build()方法获得一个Notification对象;
获得一个通知管理器NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE),通过nm.notify(int id, Notification notification)方法发送通知,至此,通知便已经发送出去
四、使用NotificationCompat.Builder设置通知的属性:
RemoteViews remoteView = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification);
Bitmap mBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_summary_notice);
Intent intent = new Intent(mContext, IconifyActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext)
.setTicker("ticker") //新来通知时在状态栏现实的文本
.setContentTitle("content title") //设置通知标题
.setContentText("content text") //设置通知文本
.setSmallIcon(R.drawable.ic_notice_1) //设置通知左上角小图标
.setContentIntent(pendingIntent) //设置点击通知的操作
.setDeleteIntent(pendingIntent) //设置删除通知时的操作
.setWhen(System.currentTimeMillis()) //设置通知上的时间戳
.setProgress(0, 0, true) //设置进度条
.setStyle(new NotificationCompat.BigTextStyle()) //设置通知样式,主要包括默认样式、BigTextStyle、BigPictureStyle和InboxStyle
.setContent(remoteView) //设置通知使用自定义的视图,而非系统默认视图
.setLargeIcon(mBitmap) //设置通知大图标
.setAutoCancel(true) //设置用户点击通知后是否自动清除通知,true:清除;false:不清
.setNumber(count) //设置通知右下角显示的数字
.setDefaults(NotificationCompat.DEFAULT_ALL) //设置应用于通知上的默认动作,如声音、三色灯、振动等
.setLights(0x0000ff, 300, 300)//设置通知三色灯
.setVibrate(new long[]{0, 300, 500, 700}) //自定义振动
.setSound(Uri.parse("file:///sdcard/xx/xx.mp3")) //自定义通知提示音
.setOngoing(false) //设置是否为一个后台任务,默认为否;true表示是一个正在进行的后台任务,如音乐播放、文件下载、数据同步等
.setPriority(NotificationCompat.PRIORITY_DEFAULT) //设置该通知相对重要性
.setColor(0x00ff00) //设置通知颜色
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) //设置通知的可见性,取值为VISIBILITY_PRIVATE(默认)、VISIBILITY_PUBLIC、VISIBILITY_SECRET中的一种
.setContentInfo("content info") //设置通知右侧的大文本内容
.setFullScreenIntent(pendingIntent, false) //设置一个直接全屏加载的动作,而不是发送通知至通知栏
.setExtras(new Bundle()) //设置通知的元信息
.setCategory(NotificationCompat.CATEGORY_MESSAGE) //设置通知所属类别
.setGroup(NotificationCompat.CATEGORY_CALL) //设置该通知为分享同一通知键值的通知组中的一部分
.setGroupSummary(false) //设置该通知为一个通知组中的摘要通知
.setUsesChronometer(false) //使用计时器而非时间戳来显示时间
.setSubText("sub text") //设置扩展视图中的子文本内容
.setLocalOnly(false) //设置该通知是否只在当前设备上显示,默认为否
.setOnlyAlertOnce(false) //设置是否只提示一次
.setSortKey("sort key"); //设置针对一个包内的通知进行排序的键值
下面对部分方法进行详细解释:
setContentIntent(PendingIntent intent)和setDeleteIntent(PendingIntent intent):设置点击该通知或删除该通知时需要进行的操作,参数为一个PendingIntent ,由该PendingIntent 指定操作意图
setProgress(int max, int progress, boolean indeterminate):设置通知中包含一个ProgressBar类型的进度条,注意:此方法在4.0及以后版本才有用,如果为早期版本:需要自定义通知布局,其中包含ProgressBar视图max:进度条的最大值;
progress:当前已完成的进度值,一般来说,当操作完成时,progress应等于max,通常将max值设为100,然后将progress值设为当前完成值占max的百分比;
indeterminate:一个boolean类型值,表示当前的进度条是为indeterminate(true)还是determinate(false);
setDefaults(int defaults):设置应用于通知上的默认提示音、震动、灯光灯,取值只能为以下三种中的一种或多种的组合,当默认灯光、震动、提示音全采用时,可以使用Notification.DEFAULT_ALL
Notification.DEFAULT_VIBRATE:添加默认震动提醒 需要 VIBRATE permission
Notification.DEFAULT_SOUND:添加默认声音提醒
Notification.DEFAULT_LIGHTS:添加默认三色灯提醒
setLights(int argb, int onMs, int offMs):自定义通知提示的三色灯灯光颜色和闪烁频率,可用于区分不同的应用场合下的通知信息;只有设置了标志符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才支持三色灯提醒,同时,并非所有的设备都支持所有的灯光颜色
argb:三色灯的颜色
onMs:三色灯亮时的持续时间(单位:毫秒)
offMs:三色灯暗时的持续时间(单位:毫秒)
setVibrate(long[] pattern):设置通知的振动模式,如setVibrate(new long[] {0,300,500,700})表示延迟0ms,振动300ms,然后延迟500ms,振动700ms,以此类推
setSound(Uri sound):设置通知的提示音,可以是自定义的提示音,也可以是默认提示音
setSound(Uri.parse("file:///sdcard/xx/xx.mp3")):设置提示音为自定义的铃声;
setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))表示获取Android多媒体库中的铃声;
setPriority(int pri):设置通知的相对优先级,系统会根据不同优先级的通知采用不同的显示方式,从而影响用户在不同优先级的通知上所消耗的时间及被打扰程度,不过一般来说,系统安排通知时的优先级包含多个方面,setPriority只是影响其中的一个方面,具体情况因平台不同而稍有不同
pri:通知的相对优先级,一个整形值,取值范围为-2(最低优先级)到2(最高优先级)
下表列出了不同优先级所对应的常量及所呈现的效果和用途
优先级
PRIORITY_MAX(2)
最高优先级,重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的
PRIORITY_HIGH(1)
高优先级,用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的
PRIORITY_DEFAULT(0)
默认优先级,用于没有特殊优先级分类的通知
PRIORITY_LOW(-1)
低优先级,可以通知用户但又不是很紧急的事件
PRIORITY_MIN(-2)
最低优先级,用于后台消息 (例如天气或者位置信息);最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容
注意:如何选择合适的优先级?
DEFAULT、HIGH 和 MAX 是中断优先级别,在活动过程中有中断用户的风险。 为了避免打扰应用的用户,中断优先级仅保留用于以下通知 :
涉及另一个用户
时间敏感
可能会立即改变用户在现实世界中的行为
LOW 和 MIN优先级通知的条件包括:
不涉及其他用户
不属于时间敏感型
包含用户可能感兴趣但可选择在空闲时浏览的内容
setVisibility(int visibility):设置通知在锁屏状态下所显示的信息详细程度,visibility的取值为以下三种之一
VISIBILITY_PUBLIC: 显示通知的完整内容
VISIBILITY_SECRET:锁屏状态下不显示此通知的任何部分
VISIBILITY_PRIVATE(默认):锁屏时显示通知图标和内容标题等基本信息,但是隐藏通知的完整内容,使用该值时,还可以提供其中隐藏了某些详细信息的替换版本的通知内容
setFullScreenIntent(PendingIntent intent, boolean highPriority):当设置该属性值时,所对应的通知将不会以通常所见的通知形式发送到用户的状态栏,而是会全屏显示参数intent对应的意图;这类通知一般是优先级非常高,需要用户进行即时处理的通知,如来电、闹钟等,注意:如若想在其他场景中使用该类型通知,一般需要为用户提供开关此类通知的功能,否则可能会因为过度打扰用户而引起用户不满;
setCategory(String category):设置通知所属的类别,category字符串必须为如下系统预定义的通知类别之一,该值主要用于系统排序和过滤
CATEGORY_CALL:来电(语音或视频)或相似的同步通信请求
CATEGORY_MESSAGE:传入的直接消息(短信、即时消息等)
CATEGORY_EMAIL:异步群发消息(电子邮件)
CATEGORY_EVENT:日历事件
CATEGORY_PROMO:促销或广告
CATEGORY_ALARM:闹铃或定时器
CATEGORY_PROGRESS:长时间运行的后台操作的进度
CATEGORY_SOCIAL:社交网络或共享更新
CATEGORY_ERROR:后台操作或身份验证状态中的错误
CATEGORY_TRANSPORT:媒体传输播放控制
CATEGORY_SYSTEM:系统或设备状态更新。保留给系统使用
CATEGORY_SERVICE:正在运行的后台服务的指示
CATEGORY_RECOMMENDATION:对于某个事件的特定、及时建议。例如,新闻应用可能会建议用户接下来可能想要阅读的新话题
CATEGORY_STATUS:有关设备或上下文状态的持续信息
五、管理通知
删除通知:除非发生以下情况之一,否则通知仍然可见:用户单独或通过使用“全部清除”清除了该通知(如果通知可以清除);
用户点击通知,且在创建通知时调用了 setAutoCancel(true);
针对特定的通知 ID 调用了 cancel(),此方法还会删除当前通知;
调用了 cancelAll() 方法,该方法将删除之前发出的所有通知;
浮动通知:对于 Android 5.0(API 级别 21),当设备处于活动状态时(即设备未锁定且其屏幕已打开),通知可以显示在小型浮动窗口中(也称为“浮动通知”)。 这些通知看上去类似于精简版的通知,只是浮动通知还显示操作按钮。 用户可以在不离开当前应用的情况下处理或清除浮动通知。可能触发浮动通知的情况有:
用户的 Activity 处于全屏模式中;
通知的优先级字段设置为 PRIORITY_MAX 或 PRIORITY_HIGH 且通知设置有声音或振动;
浮动通知的使用范例有:使用设备时来电,使用设备时闹铃,新的短信,电池电量过低
注意事项:
虽然Android 支持在通知底部显示可选的操作,但在使用这一功能时需要注意对操作进行筛选,一般,通知中应只包含最重要且有意义的操作,适合在通知中使用的操作为:对正在显示的内容类型必要、常用且常见;让用户可以迅速完成任务;而那些语义含义模糊或跟通知的默认操作一样的操作则不适合添加在通知中
注意利用通知的排名和排序:
通知属于新闻,因此基本以时间倒序显示,并且会特别考虑应用规定的通知优先级。 通知是锁定屏幕的关键部分,并且在设备显示屏每次亮起时突出显示。 锁定屏幕上的空间有限,因此确定哪些通知最为紧急或最密切相关非常重要。 由于这个原因,Android 在处理通知时使用了更为精密的排序算法,考虑到以下因素:
时间戳以及应用规定的优先级;
通知是否最近以声音或振动形式告知过用户;
与使用 EXTRA_PEOPLE 的通知相关的任何人,尤其是加星标的联系人;