Notification基础详解一(系统基础通知)

Notification基础详解一(系统基础通知)
     网上有很多关于这方面的文档,但是进过这两天的研究发现很多已经过时了,所以决定根据这两天所得到的结果写两篇博客,此博客大部分转自 http://blog.csdn.net/vipzjyno1/article/details/25248021,对一些过时了的东西,做了修改。
     在 Android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。
下面就来说说经常会使用到通知机制中的通知栏框架( 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 与 栈 的关联分析


对应的官方链接
设计文档 :   

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

通知的基本布局

普通视图:

高度64dp

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


元素:

1. 标题   Title/Name

2. 大图标  Icon/Photo

3. 内容文字   

4. 内容信息   MESSAGE
5. 小图标 Secondary Icon      经测试必须设置,而且在某些机型上,显示在左边大图标的右下角
6. 通知的时间 Timestamp,默认为系统发出通知的时间,也可通过setWhen()来设置

使用步骤:

流程模块:

第一步: 创建一个通知栏的Builder构造类  (Create a Notification Builder)
第二步: 定义通知栏的Action  (Define the Notification's Action)
第三步: 设置通知栏点击事件    (Set the Notification's Click Behavior)
第四步: 通知   (Issue the Notification)


代码模块:

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

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

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

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

第一步:获取状态通知栏管理:
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

第二步:实例化通知栏构造器NotificationCompat.Builder:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);

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

第四步:发送通知
notificationManager.notify(notifyId, mBuilder.build());

     到现在为止一个简单的通知我们就发送成功了,当然这只是系统最基本最普通的一种通知,接下来我们将对一些常用的基本设置进行详细介绍:

常用方法的设置:

(1)设置提醒标志符Flags

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

有2种设置方法:

1.实例化通知栏之后通过给他添加.flags属性赋值。
Notification notification = builder.build();
notification.flags = Notification.FLAG_AUTO_CANCEL;

2.通过setContentIntent( PendingIntent intent)方法中的意图设置对应的flags
public PendingIntent getDefalutIntent(int flags){
    PendingIntent pendingIntent= PendingIntent.getActivity(this, 1, new Intent(), flags);
    return pendingIntent;
}
flags所具有的值
Notification.FLAG_SHOW_LIGHTS             //三色灯提醒,在使用三色灯提醒时候必须加该标志符
Notification.FLAG_ONGOING_EVENT           //发起正在运行事件(活动中)                         等价于setOngoing(true)
Notification.FLAG_INSISTENT               //让声音、振动无限循环,直到用户响应 (取消或者打开)
Notification.FLAG_ONLY_ALERT_ONCE         //发起Notification后,铃声和震动均只执行一次
Notification.FLAG_AUTO_CANCEL             //用户单击通知后自动消失                             等价于setAutoCancel(true)
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(new long[] {0,300,500,700});
或者
builder.build().vibrate = new long[] {0,300,500,700};

实现效果:延迟0ms,然后振动300ms,在延迟500ms,接着在振动700ms。以此类推,2种写法都可以。

如果希望设置默认振动方式,设置了方法(2)中默认为DEFAULT_VIBRATE 即可。注意:如果设置了默认,这个设置将没有效果

(4).setLights(intledARGB ,intledOnMS ,intledOffMS )
     功能:android支持三色灯提醒,这个方法就是设置不同场景下的不同颜色的灯。
     描述: 其中ledARGB 表示灯光颜色、 ledOnMS 亮持续时间、ledOffMS 暗的时间。
     注意:1)只有在设置了标志符Flags为 Notification.FLAG_SHOW_LIGHTS的时候,才支持三色灯提醒。

          2)这边的颜色跟设备有关,不是所有的颜色都可以,要看具体设备。
使用:
.setLights(0xff0000ff, 300, 0)
或者
- Notification notify = 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"))                          //获取自定义铃声
.setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))    //获取Android多媒体库内的铃声

同理相同效果的另一种设置方法这边就不讲, 和上面的都是一样的。


(6)方法:.setPriority(int pri)


功能:设置优先级

对应优先级描述如下图:
MAX        重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的。
HIGH       高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。
DEFAULT    默认优先级用于没有特殊优先级分类的通知。
LOW        低优先级可以通知用户但又不是很紧急的事件。
MIN        用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。

对应属性:
Notification.PRIORITY_DEFAULT
Notification.PRIORITY_HIGH
Notification.PRIORITY_LOW
Notification.PRIORITY_MAX
Notification.PRIORITY_MIN


(7)方法:setOngoing(boolean ongoing)
功能:设置为ture,表示它为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
等价于设置Flags时设置 Notification.FLAG_ONGOING_EVENT

(8)方法:setProgress(int max, int progress,boolean indeterminate)

属性:max:进度条最大数值  、progress:当前进度、indeterminate:表示进度是否不确定,true为不确定,如下第3幅图所示  ,false为确定下第1幅图所示

功能:设置带进度条的通知,可以在下载中使用

效果图如下:

       

注意:此方法在4.0及以后版本才有用,如果为早期版本:需要自定义通知布局,其中包含ProgressBar视图

使用:如果为确定的进度条:调用setProgress(max, progress, false)来设置通知,在更新进度的时候在此发起通知更新progress,并且在下载完成后要移除进度条,通过调用setProgress(0, 0, false)既可。

如果为不确定(持续活动)的进度条,这是在处理进度无法准确获知时显示活动正在持续,所以调用setProgress(0, 0, true) ,操作结束时,调用setProgress(0, 0, false)并更新通知以移除指示条

PendingIntent
前面我们的处理事件都有用到 setContentIntent( PendingIntent intent)这个方法,现在我们来讲一下什么是PendingIntent:
在我个人的理解来说,他就是将要处理的Intent,比方说我们把一些要做的事情用Intent  intent来承载,然后PendingIntent就是把intent 放到PendingIntent里面随时等待触发,一但触发PendingIntent,就处理PendingIntent里面Intent的事情;

pendingIntent字面意义:等待的,未决定的Intent。
要得到一个pendingIntent对象,使用方法类的静态方法
getActivity(Context context, int requestCode, Intent intent, int flags)
getService(Context context, int requestCode, Intent intent, int flags)
getBroadcast(Context context, int requestCode, Intent intent, int flags)
参数有4个,比较重要的事第三个和第一个,其次是第四个和第二个。可以看到,要得到这个对象,必须传入一个Intent作为参数,必须有context作为参数。
pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。pendingIntent执行的操作实质上是参数传进来的Intent的操作,但是使用pendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。主要的使用的地方和例子:通知 Notificatio的发送,短消息 SmsManager 的发送和警报器AlarmManager的执行等等。

1、PendingIntent作用
Notification支持多种Intent来响应单击事件、消除事件、处理紧急状态的全屏事件等。这里就用到了setContentIntent( PendingIntent intent)来处理以上这么多的事件

根据字面意思就知道是延迟的intent,主要用来在某个事件完成后执行特定的Action。PendingIntent包含了Intent及Context,所以就算Intent所属程序结束,PendingIntent依然有效,可以在其他程序中使用。
常用在通知栏及短信发送系统中。

PendingIntent一般作为参数传给某个实例,在该实例完成某个操作后自动执行PendingIntent上的Action,也可以通过PendingIntent的send函数手动执行,并可以在send函数中设置OnFinished表示send成功后执行的动作。

2、PendingIntent举例就如我们上面那个例子

3、Intent和PendingIntent的区别

a. Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel
b. Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效
c. PendingIntent自带Context,而Intent需要在某个Context内运行
d. Intent在原task中运行,PendingIntent在新的task中运行
PendingIntent 用于描述Intent及其最终的行为.
     getActivity(Context context, int requestCode, Intent intent, int flags)系列方法从系统取得一个用于启动一个Activity的PendingIntent对象,
     getService(Context context, int requestCode, Intent intent, int flags) 方法从系统取得一个用于启动一个Service的PendingIntent对象
     getBroadcast(Context context, int requestCode, Intent intent, int flags) 方法从系统取得一个用于向BroadcastReceiver的Intent广播的PendingIntent对象
     返回的 PendingIntent 可以递交给别的应用程序,然后继续处理。这里的话你可以稍后才处理PendingIntent中描述的Intent及其最终行为。
     当你把 PendingIntent 递交给别的程序进行处理时,PendingIntent仍然拥有PendingIntent原程序所拥有的权限(with the same permissions and identity).当你从系统取得一个PendingIntent时,一定要非常小心才行。比如,通常,如果Intent目的地是你自己的component(Activity/Service/BroadcastReceiver)的话,你最好采用在Intent中显示指定目的component名字的方式,以确保Intent最终能发到目的,否则Intent最后可能不知道发到哪里了。一个PendingIntent就是Android系统中的一个token(节点,这个应该是Linux或C\C++用语)的一个对象引用,它描述了一些将用于retrieve的数据(这里,这些数据描述了Intent及其最终的行为)。
     这就意味着即使 PendingIntent 原进程结束了的话, PendingIntent本身仍然还存在,可在其他进程(PendingIntent被递交到的其他程序)中继续使用.如果我在从系统中提取一个PendingIntent的,而系统中有一个和你描述的PendingIntent对等的PendingInent, 那么系统会直接返回和该PendingIntent其实是同一token的PendingIntent,而不是一个新的token和PendingIntent。然而你在从提取PendingIntent时,通过FLAG_CANCEL_CURRENT参数,让这个老PendingIntent的先cancel()掉,这样得到的pendingInten和其token的就是新的了。
     通过 FLAG_UPDATE_CURRENT 参数的话,可以让新的Intent会更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。另外,我们也可以在PendingIntent的原进程中调用PendingIntent的cancel ()把其从系统中移除掉。

4相关属性和方法

属性:

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的时候,可以设置以下方法来相应点击事件:
Intent intent = new Intent(context,XXX.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
builder.setContentIntent(pendingIntent)  

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

采用setDeleteIntent( PendingIntent intent)方法或按照以下写法
Intent deleteIntent = new Intent();
deleteIntent.setClass(context, XXXReceiver.class);
deleteIntent.setAction(DELETE_ACTION);
notification.deleteIntent = PendingIntent.getBroadcast(context, 0, deleteIntent, 0)
例如:在响应紧急事件(如来电)时候,可以设置以下方法来相应这个事件:

采用setFullScreenIntent( PendingIntent intent, boolean highPriority)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值