您的位置:首页 > 移动开发 > Android开发

Android系统应用---Notification之一:Notification概述及使用

2016-07-24 10:10 771 查看
通知机制 是Android和用户交互,提高APP活跃度的重要手段,可以将一些重要的信息通过通知展示给用户,比如说新的聊天消息或者日历事件。Notification的设计理念是既将重要的信息告知用户又不会打断用户当前的行为,如果信息使用户关注的,用户会点击主动去执行相关的操作,对于一个APP来说,通知也不可以滥用,否则冗余的消息通知只会疏远你的用户。

 

通知可以分为ToastNotification和StatusBarNotification,Toast相对简单,我们主要研究的的是StatusBarNotification

 

Notification的功能作用

1.显示接收到短信、即时消息等信息 (如QQ、微信、短信)  

2.显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)

3.显示正在进行的事物(后台运行的程序,如音乐播放器、版本更新时候的下载进度等)

Notification的表现形式

一个通知到来之后,一般会闪烁一个5s的ticker,然后状态栏显示通知图标,下拉状态栏显示消息通知的完整信息,如下图,发送通知的同时也可以给notification添加声音、震动、闪光灯等功能用来提醒用户。

 




 

当用户点击这个notification 时,系统就会根据创建 notification 时传入的Intent来启动对应的Activity。当后台服务需要提示用户来响应某个事件时,也应该使用状态栏通知。后台服务不应该自己去启动一个
activity 来与用户互动,它应该创建一个状态栏通知,当用户选择这个通知时再去启动 activity.

可以在
Activity或者
Service中初始化一个状态栏通知,但是由于 activity 只能在它运行在前台并获取焦点时采取操作,一般我们只是用做测试,所以状态栏通知通常都是由服务创建的。

 

 

创建和更新一个Notification

使用
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记录多条通知的个数

 

●setDefaults(int defaults)   

向通知添加声音、闪灯和振动效果的最简单、使用默认(defaults)属性,可以组合多个属性对应属性:

Notification.DEFAULT_VIBRATE   //添加默认震动提醒  

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

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

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

 

 

●.setPriority(int pri)

 

功能:设置优先级

对应优先级描述如下图:

优先级
用户
MAX

重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的。

HIGH

高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。

DEFAULT

默认优先级用于没有特殊优先级分类的通知。

LOW

低优先级可以通知用户但又不是很紧急的事件。

MIN

用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。



●setOngoing(booleanongoing)

功能:设置为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); 

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: