在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。

下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知。它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等。

(网上看了下,全面介绍的文章不多,所以就萌生了写这篇的念头,随便当作回顾笔记。下面我就通过官方文档、源代码、书上的一些资料汇总下这一块的知识,并通过一个通知栏的汇总DEMO让大家更好的了解这个类的使用,内容有点多,可以根据需求看目录学习)。


Notificaiton状态通知栏:


功能作用


1.显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信)
2.显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)
3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)


思维导图结构


思维导图的大体结构(按照各个节点延伸拓展学习)

Notificaiton -- service --BroadcastReceiver -- Intent(flag、Action等属性应用) -- PendingIntent

感慨:

一个Notificaiton通知的拓展使用就要涉及与4大组建的配合,所以学好整体的知识体系。

联系:

1.由于service 是在后台运行,所以它意图做什么我们看不到,可以通过Notificaiton 来显示提醒(如音乐的后台播放)。

2.service服务和BroadcastReceiver广播相结合,在加上Notificaiton显示(如程序的后台更新)。

3.Intent作为意图处理,和Notificaiton的点击时间紧密结合在了一起,并且与BroadcastReceiver和service的联系也紧密不可以分割

service 在后台之后通过BroadcastReceiver来通知Notificaiton显示相关东西,在通过Intent完成用户的意图操作

相关文档:Activity启动模式 及 Intent Flags 与 栈 的关联分析


对应的官方链接


设计文档 :

官方http://developer.android.com/design/patterns/notifications.html

译文:http://adchs.github.io/patterns/notifications.html

使用教程 :http://developer.android.com/training/notify-user/index.html

开发文档 :http://developer.android.com/reference/android/app/Notification.html


大体了解


Notification支持文字内容显示、震动三色灯铃声等多种提示形式,在默认情况下,Notification仅显示消息标题消息内容送达时间这3项内容。以下就是通知的基本布局。

通知的基本布局

普通视图:

高度64dp

大试图的通知在展开前也显示为普通视图

元素:

1.标题 Title/Name

2.大图标 Icon/Photo

3.内容文字

4.内容信息 MESSAGE

5.小图标 Secondary Icon

6.通知的时间 Timestamp,默认为系统发出通知的时间,也可通过setWhen()来设置



相关分析


状态通知栏主要涉及到2个类: Notification 和NotificationManager

Notification为通知信息类,它里面对应了通知栏的各个属性

NotificationManager: 是状态通知的管理类,负责发通知、清除通知等操作。

注意:NotificationManager 是一个系统Service,所以必须通过getSystemService(NOTIFICATION_SERVICE)方法来获取,方法如下。

NotificationManagermNotificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

使用步骤:


流程模块:

第一步:

创建一个通知栏的Builder构造类 (Create a Notification Builder)

第二步:

定义通知栏的Action (Define the Notification's Action)

第三步:

设置通知栏点击事件 (Set the Notification's Click Behavior)

第四步:

通知 (Issue the Notification)


代码模块:


实现系统默认的通知栏效果:

第一步:获取状态通知栏管理:

NotificationManagermNotificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

第二步:实例化通知栏构造器NotificationCompat.Builder:

NotificationCompat.BuildermBuilder=newNotificationCompat.Builder(this);

第三步:对Builder进行配置:

mBuilder.setContentTitle("测试标题")//设置通知栏标题.setContentText("测试内容")/<spanstyle="font-family:Arial;">/设置通知栏显示内容</span>.setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL))//设置通知栏点击意图//.setNumber(number)//设置通知集合的数量.setTicker("测试通知来啦")//通知首次出现在通知栏,带上升动画效果的.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间.setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级//.setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消.setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接).setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合//Notification.DEFAULT_ALLNotification.DEFAULT_SOUND添加声音//requiresVIBRATEpermission.setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON

对应的各个方法的属性(部分方法以上代码中已经作注释,就不再介绍):

(1)方法:设置提醒标志符Flags

功能:提醒标志符,向通知添加声音、闪灯和振动效果等设置达到通知提醒效果,可以组合多个属性

有2种设置方法:

1.实例化通知栏之后通过给他添加.flags属性赋值。

Notificationnotification=mBuilder.build();notification.flags=Notification.FLAG_AUTO_CANCEL;

2.通过setContentIntent(PendingIntent intent)方法中的意图设置对应的flags

publicPendingIntentgetDefalutIntent(intflags){PendingIntentpendingIntent=PendingIntent.getActivity(this,1,newIntent(),flags);returnpendingIntent;}

提醒标志符成员:

Notification.FLAG_SHOW_LIGHTS //三色灯提醒,在使用三色灯提醒时候必须加该标志符

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)方法:.setDefaults(int defaults) (NotificationCompat.Builder中的方法,用于提示)


功能:向通知添加声音、闪灯和振动效果的最简单、使用默认(defaults)属性,可以组合多个属性(和方法1中提示效果一样的)

对应属性:

Notification.DEFAULT_VIBRATE //添加默认震动提醒 需要 VIBRATE permission

Notification.DEFAULT_SOUND //添加默认声音提醒

Notification.DEFAULT_LIGHTS//添加默认三色灯提醒

Notification.DEFAULT_ALL//添加默认以上3种全部提醒

(3)方法:setVibrate(long[] pattern)


功能:设置震动方式。

使用:

.setVibrate(newlong[]{0,300,500,700});

实现效果:延迟0ms,然后振动300ms,在延迟500ms,接着在振动700ms。

以上方法的还有种写法是

mBuilder.build().vibrate=newlong[]{0,300,500,700};

以此类推,2种写法都可以。

如果希望设置默认振动方式,设置了方法(2)中默认为DEFAULT_VIBRATE 即可。

(4)方法:.setLights(intledARGB,intledOnMS,intledOffMS)


功能:android支持三色灯提醒,这个方法就是设置不同场景下的不同颜色的灯。

描述:其中ledARGB 表示灯光颜色、ledOnMS 亮持续时间、ledOffMS 暗的时间。

注意:1)只有在设置了标志符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才支持三色灯提醒。

2)这边的颜色跟设备有关,不是所有的颜色都可以,要看具体设备。

.setLights(0xff0000ff,300,0)

同理,以下方法也可以设置同样效果:

Notificationnotify=mBuilder.build();notify.flags=Notification.FLAG_SHOW_LIGHTS;notify.ledARGB=0xff0000ff;notify.ledOnMS=300;notify.ledOffMS=300;

如果希望使用默认的三色灯提醒,设置了方法(2)中默认为DEFAULT_LIGHTS即可。

(5)方法:.setSound(Uri sound)


功能:设置默认或则自定义的铃声,来提醒。

//获取默认铃声.setDefaults(Notification.DEFAULT_SOUND)//获取自定义铃声.setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))//获取Android多媒体库内的铃声.setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,"5"))

第四步:设置通知栏PendingIntent(点击动作事件等都包含在这里)

在第三步中,没有提到一个方法,就是setContentIntent(PendingIntent intent)这个方法,这里拿到这里讲。



知识点

1)什么是PendingIntent


PendingIntent和Intent略有不同,它可以设置执行次数,主要用于远程服务通信、闹铃、通知、启动器、短信中,在一般情况下用的比较少。


2)PendingIntent什么用


Notification支持多种Intent来响应单击事件、消除事件、处理紧急状态的全屏事件等。

这里就用到了setContentIntent(PendingIntentintent)来处理以上这么多的事件。


3)相关属性和方法

属性:

PendingIntent的位标识符:

FLAG_ONE_SHOT 表示返回的PendingIntent仅能执行一次,执行完后自动取消

FLAG_NO_CREATE 表示如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL

FLAG_CANCEL_CURRENT 表示相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent,这个有利于数据保持为最新的,可以用于即时通信的通信场景

FLAG_UPDATE_CURRENT 表示更新的PendingIntent

在各种情况下情况下它还会根据各种情况出发效果:

contentIntent:在通知窗口区域,Notification被单击时的响应事件由该intent触发;

deleteIntent:当用户点击全部清除按钮时,响应该清除事件的Intent;

fullScreenIntent:响应紧急状态的全屏事件(例如来电事件),也就是说通知来的时候,跳过在通知区域点击通知这一步,直接执行fullScreenIntent代表的事件。


例如:在执行了点击通知之后要跳转到指定的XXX的Activity的时候,可以设置以下方法来相应点击事件:

Intentintent=newIntent(context,XXX.class);PendingIntentpendingIntent=PendingIntent.getActivity(context,0,intent,0);mBuilder.setContentIntent(pendingIntent)

例如:在执行了清空全部的通知操作时候,可以设置以下方法来相应这个事件:

采用setDeleteIntent(PendingIntent intent)方法或按照以下写法

IntentdeleteIntent=newIntent();deleteIntent.setClass(context,XXXReceiver.class);deleteIntent.setAction(DELETE_ACTION);notification.deleteIntent=PendingIntent.getBroadcast(context,0,deleteIntent,0);

例如:在响应紧急事件(如来电)时候,可以设置以下方法来相应这个事件:

采用setFullScreenIntent(PendingIntentintent, boolean highPriority)

第五步,最简单的一部,发送通知请求

mNotificationManager.notify(notifyId,mBuilder.build());

更多相关文章

  1. Android自定义进度条——圆角横向进度条
  2. android webview图片文件上传兼容性问题——上传控件点击无效的
  3. android 中组件 service
  4. Android中OnkeyDown事件和OnBackPressed方法区别、兼容、使用
  5. Android程序的调试--善用Log
  6. ActivityThread的main方法究竟做了什么?
  7. android的wake_lock介绍
  8. Android(安卓)绘制文本垂直居中
  9. Android(安卓)Matrix处理ImageView中图片缩放,平移

随机推荐

  1. 使用RBAC在Kubernetes中配置权限
  2. Ansible 变量
  3. 一个 Markdown 编辑器的诞生
  4. redis
  5. 欧洲顶级银行 BBVA,区块链与 DevOps 的先
  6. 14:VMware Horizon View 8.0-创建完整克隆
  7. 【必读】2021年DevOps工程师学习路径
  8. 2021年DevOps工程师需要掌握哪些技能才可
  9. JMeter如何使用MD5加密并且对body进行指
  10. 话说 类加载过程 第二篇