标签:
通知机制 是Android和用户交互,提高APP活跃度的重要手段,可以将一些重要的信息通过通知展示给用户,比如说新的聊天消息或者日历事件。Notification的设计理念是既将重要的信息告知用户又不会打断用户当前的行为,如果信息使用户关注的,用户会点击主动去执行相关的操作,对于一个APP来说,通知也不可以滥用,否则冗余的消息通知只会疏远你的用户。
通知可以分为ToastNotification和StatusBarNotification,Toast相对简单,我们主要研究的的是StatusBarNotification
1.显示接收到短信、即时消息等信息 (如QQ、微信、短信)
2.显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)
3.显示正在进行的事物(后台运行的程序,如音乐播放器、版本更新时候的下载进度等)
一个通知到来之后,一般会闪烁一个5s的ticker,然后状态栏显示通知图标,下拉状态栏显示消息通知的完整信息,如下图,发送通知的同时也可以给notification添加声音、震动、闪光灯等功能用来提醒用户。
当用户点击这个notification 时,系统就会根据创建 notification 时传入的Intent来启动对应的Activity。当后台服务需要提示用户来响应某个事件时,也应该使用状态栏通知。后台服务不应该自己去启动一个 activity 来与用户互动,它应该创建一个状态栏通知,当用户选择这个通知时再去启动 activity.
可以在 Activity或者 Service中初始化一个状态栏通知,但是由于 activity 只能在它运行在前台并获取焦点时采取操作,一般我们只是用做测试,所以状态栏通知通常都是由服务创建的。
使用 Notification类和 NotificationManager类来创建一个状态栏通知
NotificationManager类是用来管理所有通知的系统服务,通getSystemService()方法来获得它的引用。使用Notification实例去配置一个状态栏通知的属性,比如图标、内容、其他的设置)等。然后,通过notify()方法将你的Notification发送出去.
Android3.0之前,直接创建一个Notification
1. 获取 NotificationManager的引用
NotificationManager mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
2. 创建 Notification
Notification notification =new Notification(icon,tickerText,when);
3. 定义通知的内容和PendingIntent:
//实例化Intent
Intent notificationIntent = new Intent(this, MyClass.class);
//获取PendingIntent
PendingIntent contentIntent =PendingIntent.getActivity(this, 0,notificationIntent, 0);
//设置事件信息
notification.setLatestEventInfo(context,contentTitle, contentText, contentIntent);
4. 把 Notification传给NotificationManager:
mNotificationManager.notify(id, notification);
3.0之后,为了更好地管理通知,androidSDK引入了Notification的内部类Notification.Builder,一般用于管理Notification,动态的设置Notification的一些属性,使用set来设置相关属性,set方法有返回值,返回配置后的builder对象。
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Builderbuilder = new NotificationCompat.Builder(MainActivity.this);
PendingIntentcontentIndent =PendingIntent.getActivity(MainActivity.this, 0,new Intent(MainActivity.this,MainActivity.class),PendingIntent.FLAG_UPDATE_CURRENT);
builder .setContentIntent(contentIndent)
.setSmallIcon(R.drawable.ic_launcher)//设置状态栏显示的小图标
.setLargeIcon(BitmapFactory.decodeResource(res,R.drawable.i5))//下拉下拉列表里面的图标(大图标)
.setTicker("this is bitch!") //设置状态栏的显示的信息
.setWhen(System.currentTimeMillis())//设置时间发生时间
.setAutoCancel(true)//设置可以清除
.setContentTitle("This is ContentTitle")//设置下拉列表里的标题
.setContentText("this is ContentText");//设置上下文内容
//获取添加了各种属性的新的notification对象
Notificationnotification = builder.build();
//加id是为了显示多条Notification
notificationManager.notify(id,notification);
★发送通知方法的第一个参数是通知的 ID,第二个参数是要发送的 Notification实例。ID是你程序中通知的身份识别,更新一条通知的时候也是通过这个ID,就不会产生过多的通知了,只要ID相同,就可以更新这条通知。
★PendingIntent和Intent略有不同,它可以设置执行次数,主要用于远程服务通信、闹铃、通知、启动器、短信中。Notification支持多种Intent来响应单击事件、消除事件、处理紧急状态的全屏事件等,用到了setContentIntent(PendingIntent intent)来处理以上事件。
可以给通知设置一个默认的声音或者在程序中指定一个声音.
默认声音:notification.defaults |=Notification.DEFAULT_SOUND;
自定义通知声音:
//获取默认铃声
.setDefaults(Notification.DEFAULT_SOUND)
//获取自定义铃声
.setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
//获取Android多媒体库内的铃声
.setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,"5"))
★如果 defaults 属性中有 DEFAULT_SOUND,那么默认的声音将会覆盖自定义设置的声音。
可以通过默认的震动提示用户,或者在应用中自定义一种震动形式.
使用默认震动:
notification.defaults |= Notification.DEFAULT_VIBRATE;
要实现自定义的震动,将一个 long 型数组传给 vibrate 属性:
long[] vibrate ={0,100,200,300};//延时0ms,震动100ms,延时200ms,震动300ms
builder.setVibrate(vibrate);
★如果 defaults 属性中包含了 DEFAULT_VIBRATE值,那么默认的震动形式将会覆盖自定义的震动
可以使用默认的闪光灯,也可以在程序中自定义闪光灯的颜色和形式.
使用默认的闪光灯:
notification.defaults |= Notification.DEFAULT_LIGHTS;
自定义闪光灯:
需要设置如下属性ledARGB表示颜色,ledOffMS表示灯灭的时间,ledOnMS表示灯亮的时间
Builder.setLights(int argb,int onMs, int offMs)
★只有在设置了标志符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才支持三色灯提醒。
★颜色跟设备有关,不是所有的颜色都可以,要看具体设备。
Notification常用的其它标识flag和属性字段和方法
●FLAG_AUTO_CANCEL :用户点击通知后,通知就会自动取消掉.
●FLAG_INSISTENT:通知音频将会不断重复播放,直到用户对这个通知作出响应.
●FLAG_ONLY_ALERT_ONCE:发起Notification后,铃声和震动均只执行一次
●FLAG_ONGOING_EVENT:归类到“正在运行”下
●FLAG_NO_CLEAR:清除通知是不会清除该通知
●FLAG_FOREGROUND_SERVICE:表示正在运行的服务
使用方法:在实例化通知栏后天使用flags添加对应的属性值,多个属性之间用或表示
Notification notification = mBuilder.build();
notification.flags= Notification.FLAG_AUTO_CANCEL;
●number记录多条通知的个数
向通知添加声音、闪灯和振动效果的最简单、使用默认(defaults)属性,可以组合多个属性对应属性:
Notification.DEFAULT_VIBRATE //添加默认震动提醒
Notification.DEFAULT_SOUND // 添加默认声音提醒
Notification.DEFAULT_LIGHTS// 添加默认三色灯提醒
Notification.DEFAULT_ALL// 添加默认以上3种全部提醒
功能:设置优先级
对应优先级描述如下图:
优先级 |
用户 |
MAX |
重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的。 |
HIGH |
高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。 |
DEFAULT |
默认优先级用于没有特殊优先级分类的通知。 |
LOW |
低优先级可以通知用户但又不是很紧急的事件。 |
MIN |
用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。 |
功能:设置为ture,表示它为一个正在进行的通知。他们通常是用来表示一个后台任务,不可删除
当有需求在通知中显示非默认的内容的时候,可以使用 RemoteViews来自定义通知的显示内容
Notification的自定义布局是RemoteViews,和其他RemoteViews一样,在自定义视图布局文件中,仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件,否则会引起ClassNotFoundException异常
步骤如下:
1)创建自定义视图
2)获取远程视图对象
RemoteViews contentView = newRemoteViews(getPackageName(),R.layout.custom_notification_layout);
contentView.setImageViewResource(R.id.image,R.drawable.notification_image);
contentView.setTextViewText(R.id.title,"Customnotification");
contentView.setTextViewText(R.id.text,"This is acustom layout");
//将 RemoveViews 对象传给通知的 contentView 属性
mBuilder.setContent(mRemoteViews)
3)设置PendingIntent(来响应各种事件)
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_prev,intent_prev);
4)发起Notification
mNotificationManager.notify(notifyId, notify);
Android系统应用---Notification之一:Notification概述及使用
标签:
原文地址:http://blog.csdn.net/weilaideta/article/details/52012584