Android通知栏Notification的整合全⾯学习(⼀个DEMO让你完全了解它)
在android的应⽤层中,涉及到很多应⽤框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。
下⾯就来说说经常会使⽤到通知机制中的通知栏框架(Notificaiton),它适⽤于交互事件的通知。它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件该更新了,什么⼈发你微信消息了等。
(⽹上看了下,全⾯介绍的⽂章不多,所以就萌⽣了写这篇的念头,随便当作回顾笔记。下⾯我就通过官⽅⽂档、源代码、书上的⼀些资料汇总下这⼀块的知识,并通过⼀个通知栏的汇总DEMO让⼤家更好的了解这个类的使⽤,内容有点多,可以根据需求看⽬录学习)。
Notificaiton状态通知栏:
功能作⽤
1.显⽰接收到短消息、即使消息等信息(如QQ、微信、新浪、短信)
2.显⽰客户端的推送消息(如有新版本发布,⼴告,推荐新闻等)
3.显⽰正在进⾏的事物(例如:后台运⾏的程序)(如⾳乐播放器、版本更新时候的下载进度等)
思维导图结构
思维导图的⼤体结构(按照各个节点延伸拓展学习)
Notificaiton -- rvice -- BroadcastReceiver -- Intent(flag、Action等属性应⽤) -- PendingIntent
感慨:
⼀个Notificaiton通知的拓展使⽤就要涉及与4⼤组建的配合,所以学好整体的知识体系。
联系:
1.由于rvice 是在后台运⾏,所以它意图做什么我们看不到,可以通过Notificaiton 来显⽰提醒(如⾳乐的后台播放)。
2.rvice服务和BroadcastReceiver⼴播相结合,在加上Notificaiton 显⽰(如程序的后台更新)。
3.Intent作为意图处理,和Notificaiton的点击时间紧密结合在了⼀起,并且与BroadcastReceiver和rvice的联系也紧密不可以分割。
(rvice 在后台之后通过BroadcastReceiver来通知Notificaiton 显⽰相关东西,在通过Intent完成⽤
户的意图操作)
相关⽂档:Activity启动模式及 Intent Flags 与栈的关联分析
对应的官⽅链接
设计⽂档:
官⽅:/design/patterns/notifications.html
译⽂:adchs.github.io/patterns/notifications.html
使⽤教程:/training/notify-ur/index.html
开发⽂档:/reference/android/app/Notification.html
⼤体了解
Notification⽀持⽂字内容显⽰、震动、三⾊灯、铃声等多种提⽰形式,在默认情况下,Notification仅显⽰消息标题、消息内容、送达时间这3项内容。以下就是通知的基本布局。
通知的基本布局:
普通视图:
⾼度64dp
⼤试图的通知在展开前也显⽰为普通视图
元素:
1. 标题 Title/Name
2. ⼤图标 Icon/Photo
3. 内容⽂字
4. 内容信息 MESSAGE
5. ⼩图标 Secondary Icon
6. 通知的时间 Timestamp,默认为系统发出通知的时间,也可通过tWhen()来设置
相关分析
状态通知栏主要涉及到2个类: Notification 和 NotificationManager
Notification为通知信息类,它⾥⾯对应了通知栏的各个属性
NotificationManager :是状态栏通知的管理类,负责发通知、清除通知等操作。
注意:NotificationManager 是⼀个系统Service,所以必须通过 getSystemService(NOTIFICATION_SERVICE)⽅法来获取,⽅法如下。
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
使⽤步骤:
流程模块:
第⼀步:
创建⼀个通知栏的Builder构造类(Create a Notification Builder)
第⼆步:
定义通知栏的Action (Define the Notification's Action)
第三步:
设置通知栏点击事件(Set the Notification's Click Behavior)
第四步:
通知(Issue the Notification)
代码模块:
实现系统默认的通知栏效果:
第⼀步:获取状态通知栏管理:
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
第⼆步:实例化通知栏构造器NotificationCompat.Builder:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
第三步:对Builder进⾏配置:
1. mBuilder.tContentTitle("测试标题")//设置通知栏标题
2. .tContentText("测试内容") //设置通知栏显⽰内容
3. .tContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图
4. // .tNumber(number) //设置通知集合的数量
5. .tTicker("测试通知来啦") //通知⾸次出现在通知栏,带上升动画效果的
6. .tWhen(System.currentTimeMillis())//通知产⽣的时间,会在通知信息⾥显⽰,⼀般是系统获取到的时间
7. .tPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级
8. // .tAutoCancel(true)//设置这个标志当⽤户单击⾯板就可以让通知将⾃动取消
9. .tOngoing(fal)//ture,设置他为⼀个正在进⾏的通知。他们通常是⽤来表⽰⼀个后台任务,⽤户积极参与(如播放⾳乐)或以某种⽅式正在等待,因此占⽤设备(如⼀个⽂件下载,同步操作,主动⽹络
连接)
10. .tDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声⾳、闪灯和振动效果的最简单、最⼀致的⽅式是使⽤当前的⽤户默认设置,使⽤defaults属性,可以组合沦陷的意思
11. //Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加声⾳ // requires VIBRATE permission
12. .tSmallIcon(R.drawable.ic_launcher);//设置通知⼩ICON
对应的各个⽅法的属性(部分⽅法以上代码中已经作注释,就不再介绍):
(1)⽅法:设置提醒标志符Flags
功能:提醒标志符,向通知添加声⾳、闪灯和振动效果等设置达到通知提醒效果,可以组合多个属性
有2种设置⽅法:
1.实例化通知栏之后通过给他添加.flags属性赋值。
1. Notification notification = mBuilder.build();
2. notification.flags = Notification.FLAG_AUTO_CANCEL;
2.通过tContentIntent(PendingIntent intent)⽅法中的意图设置对应的flags
1. public PendingIntent getDefalutIntent(int flags){
2. PendingIntent pendingIntent= Activity(this, 1, new Intent(), flags);
3. return pendingIntent;
4. }
提醒标志符成员:
Notification.FLAG_SHOW_LIGHTS //三⾊灯提醒,在使⽤三⾊灯提醒时候必须加该标志符qq黄砖
Notification.FLAG_ONGOING_EVENT //发起正在运⾏事件(活动中)
Notification.FLAG_INSISTENT //让声⾳、振动⽆限循环,直到⽤户响应(取消或者打开)
Notification.FLAG_ONLY_ALERT_ONCE //发起Notification后,铃声和震动均只执⾏⼀次
Notification.FLAG_AUTO_CANCEL //⽤户单击通知后⾃动消失
太平洋地震带Notification.FLAG_NO_CLEAR //只有全部清除时,Notification才会清除,不清楚该通知(QQ的通知⽆法清除,就是⽤的这个)
Notification.FLAG_FOREGROUND_SERVICE //表⽰正在运⾏的服务
(2)⽅法:.tDefaults(int defaults) (NotificationCompat.Builder中的⽅法,⽤于提⽰)
功能:向通知添加声⾳、闪灯和振动效果的最简单、使⽤默认(defaults)属性,可以组合多个属性(和⽅法1中提⽰效果⼀样的)
对应属性:
Notification.DEFAULT_VIBRATE //添加默认震动提醒需要 VIBRATE permission
Notification.DEFAULT_SOUND // 添加默认声⾳提醒
Notification.DEFAULT_LIGHTS// 添加默认三⾊灯提醒
Notification.DEFAULT_ALL// 添加默认以上3种全部提醒
(3)⽅法:tVibrate(long[] pattern)
功能:设置震动⽅式。
使⽤:
.tVibrate(new long[] {0,300,500,700});
实现效果:延迟0ms,然后振动300ms,在延迟500ms,接着在振动700ms。
以上⽅法的还有种写法是
mBuilder.build().vibrate = new long[] {0,300,500,700};
以此类推,2种写法都可以。
如果希望设置默认振动⽅式,设置了⽅法(2)中默认为DEFAULT_VIBRATE 即可。
(4)⽅法:.tLights(intledARGB ,intledOnMS ,intledOffMS )
功能:android⽀持三⾊灯提醒,这个⽅法就是设置不同场景下的不同颜⾊的灯。
描述:其中ledARGB 表⽰灯光颜⾊、 ledOnMS 亮持续时间、ledOffMS 暗的时间。
注意:1)只有在设置了标志符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才⽀持三⾊灯提醒。
2)这边的颜⾊跟设备有关,不是所有的颜⾊都可以,要看具体设备。
使⽤:
.tLights(0xff0000ff, 300, 0)
同理,以下⽅法也可以设置同样效果:
1. Notification notify = mBuilder.build();
2. notify.flags = Notification.FLAG_SHOW_LIGHTS;
3. notify.ledARGB = 0xff0000ff;
4. notify.ledOnMS = 300;
5. notify.ledOffMS = 300;
如果希望使⽤默认的三⾊灯提醒,设置了⽅法(2)中默认为DEFAULT_LIGHTS即可。新生儿排便
(5)⽅法:.tSound(Uri sound)
功能:设置默认或则⾃定义的铃声,来提醒。
1. //获取默认铃声
2. .tDefaults(Notification.DEFAULT_SOUND)
3. //获取⾃定义铃声
卡通画图片大全可爱
4. .tSound(Uri.par("file:///sdcard/xx/xx.mp3"))
5. //获取Android多媒体库内的铃声
6. .tSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))
同理相同效果的另⼀种设置⽅法这边就不讲,和上⾯的都是⼀样的。
(6)⽅法:.tPriority(int pri)
功能:设置优先级
对应优先级描述如下图:
优先级⽤户
MAX重要⽽紧急的通知,通知⽤户这个事件是时间上紧迫的或者需要⽴即处理的。
HIGH⾼优先级⽤于重要的通信内容,例如短消息或者聊天,这些都是对⽤户来说⽐较有兴趣的。
DEFAULT默认优先级⽤于没有特殊优先级分类的通知。
LOW低优先级可以通知⽤户但⼜不是很紧急的事件。
MIN⽤于后台消息 (例如天⽓或者位置信息)。最低优先级通知将只在状态栏显⽰图标,只有⽤户下拉通知抽屉才能看到内容。
对应属性(作⽤看上图就可知道):
Notification.PRIORITY_DEFAULT
Notification.PRIORITY_HIGH
Notification.PRIORITY_LOW
Notification.PRIORITY_MAX
Notification.PRIORITY_MIN
(7)⽅法:tOngoing(boolean ongoing)
功能:设置为ture,表⽰它为⼀个正在进⾏的通知。他们通常是⽤来表⽰⼀个后台任务,⽤户积极参与(如播放⾳乐)或以某种⽅式正在等待,因此占⽤设备(如⼀个⽂件下载,同步操作,主动⽹络连接)
(8)⽅法:tProgress(int max, int progress,boolean indeterminate)
属性:max:进度条最⼤数值、progress:当前进度、indeterminate:表⽰进度是否不确定,true为不确定,如下第3幅图所⽰,fal为确定下第1幅图所⽰
功能:设置带进度条的通知,可以在下载中使⽤
效果图如下:
注意:此⽅法在4.0及以后版本才有⽤,如果为早期版本:需要⾃定义通知布局,其中包含ProgressB
ar视图
使⽤:如果为确定的进度条:调⽤tProgress(max, progress, fal)来设置通知,在更新进度的时候在此发起通知更新progress,并且在下载完成后要移除进度条,通过调⽤tProgress(0, 0, fal)既可。如果为不确定(持续活动)的进度条,这是在处理进度⽆法准确获知时显⽰活动正在持续,所以调⽤tProgress(0, 0, true) ,操作结束时,调⽤tProgress(0, 0, fal)并更新通知以移除指⽰条
第四步:设置通知栏PendingIntent(点击动作事件等都包含在这⾥)
在第三步中,没有提到⼀个⽅法,就是tContentIntent(PendingIntent intent)这个⽅法,这⾥拿到这⾥讲。
知识点
1)什么是PendingIntent
PendingIntent和Intent略有不同,它可以设置执⾏次数,主要⽤于远程服务通信、闹铃、通知、启动器、短信中,在⼀般情况下⽤的⽐较少。
2)PendingIntent什么⽤
Notification⽀持多种Intent来响应单击事件、消除事件、处理紧急状态的全屏事件等。
这⾥就⽤到了tContentIntent(PendingIntent intent)来处理以上这么多的事件。
3)相关属性和⽅法
属性:
PendingIntent的位标识符:
FLAG_ONE_SHOT 表⽰返回的PendingIntent仅能执⾏⼀次,执⾏完后⾃动取消
FLAG_NO_CREATE 表⽰如果描述的PendingIntent不存在,并不创建相应的PendingIntent,⽽是返回NULL
FLAG_CANCEL_CURRENT 表⽰相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent,这个有利于数据保持为最新的,可以⽤于即时通信的通信场景
FLAG_UPDATE_CURRENT 表⽰更新的PendingIntent
⽅法:
可以看出,它⽀持多种相应⽅式,有Activity、Broadcast、Service,就根据你⾃⾝需求去选择。
在各种情况下情况下它还会根据各种情况出发效果:
contentIntent:在通知窗⼝区域,Notification被单击时的响应事件由该intent触发;
deleteIntent:当⽤户点击全部清除按钮时,响应该清除事件的Intent;
fullScreenIntent:响应紧急状态的全屏事件(例如来电事件),也就是说通知来的时候,跳过在通知区域点击通知这⼀步,直接执⾏fullScreenIntent代表的事件。
例如:在执⾏了点击通知之后要跳转到指定的XXX的Activity的时候,可以设置以下⽅法来相应点击事件:
1. Intent intent = new Intent(context,XXX.class);
2. PendingIntent pendingIntent = Activity(context, 0, intent, 0);
3. mBuilder.tContentIntent(pendingIntent)
例如:在执⾏了清空全部的通知操作时候,可以设置以下⽅法来相应这个事件:
采⽤tDeleteIntent(PendingIntent intent)⽅法或按照以下写法
1. Intent deleteIntent = new Intent();
2. deleteIntent.tClass(context, XXXReceiver.class);
3. deleteIntent.tAction(DELETE_ACTION);
4. notification.deleteIntent = Broadcast(context, 0, deleteIntent, 0);
例如:在响应紧急事件(如来电)时候,可以设置以下⽅法来相应这个事件:
采⽤tFullScreenIntent(PendingIntent intent, boolean highPriority)
怎么让第五步,最简单的⼀部,发送通知请求
拓展
实现⾃定义的通知栏效果:
这⾥要⽤到RemoteViews这个类。实现以下2种⾃定义布局。
注意:
Notification的⾃定义布局是RemoteViews,和其他RemoteViews⼀样,在⾃定义视图布局⽂件中,仅⽀持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显⽰控件,不⽀持这些类的⼦类或Android提供的其他控件。否则会引起ClassNotFoundException异常
步骤如下:
1)创建⾃定义视图
2)获取远程视图对象(注:Notification的contentView不能为空)
3)设置PendingIntent(来响应各种事件)
4)发起Notification
⼤体4步骤这⾥就不详细说了,下⾯就把DEMO中的列⼦拿出来说下
样式:
1.⾃定义带按钮通知栏(如下样式)
正在进⾏的
“正在进⾏的”通知使⽤户了解正在运⾏的后台进
程。例如,⾳乐播放器可以显⽰正在播放的⾳
乐。也可以⽤来显⽰需要长时间处理的操作,例
如下载或编码视频。“正在进⾏的”通知不能被⼿
动删除。
实现⽅法如下:
1. /**
2. * 带按钮的通知栏
3. */
4. public void showButtonNotify(){
5. NotificationCompat.Builder mBuilder = new Builder(this);
6. RemoteViews mRemoteViews = new RemoteViews(getPackageName(), R.layout.view_custom_button);
7. mRemoteViews.tImageViewResource(R.id.custom_song_icon, R.drawable.sing_icon);
8. //API3.0 以上的时候显⽰按钮,否则消失
9. mRemoteViews.tTextViewText(R.id.tv_custom_song_singer, "周杰伦");
10. mRemoteViews.tTextViewText(R.id.tv_custom_song_name, "七⾥⾹");
11. //如果版本号低于(3。0),那么不显⽰按钮
12. SystemVersion() <= 9){
13. mRemoteViews.tViewVisibility(R.id.ll_custom_button, View.GONE);
14. }el{
15. mRemoteViews.tViewVisibility(R.id.ll_custom_button, View.VISIBLE);
16. }
17. //
18. if(isPlay){
19. mRemoteViews.tImageViewResource(R.id.btn_custom_play, R.drawable.btn_pau);
20. }el{
21. mRemoteViews.tImageViewResource(R.id.btn_custom_play, R.drawable.btn_play);
22. }
23. //点击的事件处理
24. Intent buttonIntent = new Intent(ACTION_BUTTON);
25. /* 上⼀⾸按钮 */
26. buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PREV_ID);
27. //这⾥加了⼴播,所及INTENT的必须⽤getBroadcast⽅法
痔疮图片女性
28. PendingIntent intent_prev = Broadcast(this, 1, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
29. mRemoteViews.tOnClickPendingIntent(R.id.btn_custom_prev, intent_prev);
30. /* 播放/暂停按钮 */
31. buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PALY_ID);
32. PendingIntent intent_paly = Broadcast(this, 2, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
33. mRemoteViews.tOnClickPendingIntent(R.id.btn_custom_play, intent_paly);
34. /* 下⼀⾸按钮 */
35. buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_NEXT_ID);
36. PendingIntent intent_next = Broadcast(this, 3, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
37. mRemoteViews.tOnClickPendingIntent(R.id.btn_custom_next, intent_next);
38.
39. mBuilder.tContent(mRemoteViews)
40. .tContentIntent(getDefalutIntent(Notification.FLAG_ONGOING_EVENT))
41. .tWhen(System.currentTimeMillis())// 通知产⽣的时间,会在通知信息⾥显⽰
42. .tTicker("正在播放")
43. .tPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级
44. .tOngoing(true)
45. .tSmallIcon(R.drawable.sing_icon);
46. Notification notify = mBuilder.build();
47. notify.flags = Notification.FLAG_ONGOING_EVENT;
48. ify(notifyId, notify);
49. }
注意:带按钮的布局相应点击事件在3.0以下版本没有⽤,所以这边作了系统版本判断,来显⽰消失按钮。
2.⾃定义不带按钮通知栏
实现⽅法如下:
1. //先设定RemoteViews
2. RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.view_custom);
七年级下册古诗词全部
3. //设置对应IMAGEVIEW的ID的资源图⽚
4. view_custom.tImageViewResource(R.id.custom_icon, R.drawable.icon);
5. // view_custom.tInt(R.id.custom_icon,"tBackgroundResource",R.drawable.icon);
6. view_custom.tTextViewText(R.id.tv_custom_title, "今⽇头条");
7. view_custom.tTextViewText(R.id.tv_custom_content, "⾦州勇⼠官⽅宣布球队已经解雇了主帅马克-杰克逊,随后宣布了最后的结果。");
之后调⽤:
mBuilder.tContent(view_custom)
来设定⾃定义的这个布局。
实现:⼤视图风格通知(注:4.1之前的版本不⽀持⼤视图)
只在通知被展开时显⽰
何时展开:通知处在顶端,或者⽤户通过收拾展开
收件箱风格的通知:
相⽐普通视图,只多出:7. 详情区域
效果图如下:
详情区域根据⽤途可有多种风格:
1.NotificationCompat.BigPictureStyle ⼤图⽚风格:详情区域包含⼀个256dp⾼度的位图
2.NotificationCompat.BigTextStyle ⼤⽂字风格:显⽰⼀个⼤的⽂字块
3.NotificationCompat.InboxStyle 收件箱风格:显⽰多⾏⽂字
各种风格都具有以下常规视图不具有的内容选项:
1.⼤标题:在展开视图时替代普通视图的标记
2.总结⽂字:允许你在详情区域之下增加⼀⾏内容
拿收件箱风格为例,实现代码如下:
1. NotificationCompat.BigPictureStyle inboxStyle = new NotificationCompat.InboxStyle();
2. String[] events = new String[5];
3. // Sets a title for the Inbox style big view
4. inboxStyle.tBigContentTitle("⼤视图内容:");
5. // Moves events into the big view
6. for (int i=0; i < events.length; i++) {