Android通知栏

本文深入讲解Android中的通知机制,包括Notification的基本用法、如何设置不同的提醒标志符、使用PendingIntent处理点击事件,以及如何实现自定义通知栏效果等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道在通知栏上除了显示默认通知之外,还可以显示自定义布局的通知。通知在我们的日常开发中是最常见的技术,Android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。

下面我们来看看notification和各大组件之间的关系:

notification——service——broadcastrecever——inttent(action/flag)——pendinginttent

系统默认弹出通知如下:

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

通知的基本布局


高度64dp

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

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

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

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

NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

 获取默认通知栏的方法如下:

// 实例化通知栏构造器NotificationCompat.Builder
				Notification.Builder notification = new Notification.Builder(
						NotifcationActivity.this);
				// 设置通知栏小图标
				notification.setSmallIcon(R.drawable.letongdesklogo);
				// 通知闪光内容
				notification.setTicker("hello word!!!!!");
				// 通知时间显示
				notification.setWhen(System.currentTimeMillis());
				// 通知标题
				notification.setContentTitle("通知");
				// 通知内容
				notification.setContentText("点击查看消息");
				// 向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,
				// 使用defaults属性,可以组合
				// Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加声音
				notification.setDefaults(Notification.DEFAULT_ALL);
				// 打开程序后图标消失
				notification.setAutoCancel(true);
				// .setNumber(number) //设置通知集合的数量
				notification.setPriority(Notification.PRIORITY_DEFAULT); // 设置该通知优先级
				Intent intent = new Intent(NotifcationActivity.this,
						Demo1A.class);
				PendingIntent pendingIntent = PendingIntent.getActivity(
						NotifcationActivity.this, 0, intent,
						PendingIntent.FLAG_UPDATE_CURRENT);
				notification.setContentIntent(pendingIntent);
				Notification notification2 = notification.build();
				NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
				manager.notify(1, notification2);

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

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

有2种设置方法:

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

Notification notification = mBuilder.build();  
notification.flags = Notification.FLAG_AUTO_CANCEL; 
提醒标志符成员:

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(new long[] {0,300,500,700}); 

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

以上方法的还有种写法是

notification.build().vibrate = new long[] {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)  

同理,以下方法也可以设置同样效果:
Notification notify = mBuilder.build();  
notify.flags = Notification.FLAG_SHOW_LIGHTS;  
notify.ledARGB = 0xff0000ff;  
notify.ledOnMS = 300;  
notify.ledOffMS = 300;  

如果希望使用默认的三色灯提醒,设置了方法(2)中默认为DEFAULT_LIGHTS即可。
(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"))  
//获取Android多媒体库内的铃声  
.setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))  

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

(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,表示它为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)


(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(点击动作事件等都包含在这里)
1)什么是PendingIntent

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


2)PendingIntent什么用

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

这里就用到了setContentIntent(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代表的事件。

Intent intent = new Intent(NotifcationActivity.this,
						Demo1A.class);
				PendingIntent pendingIntent = PendingIntent.getActivity(
						NotifcationActivity.this, 0, intent,
						PendingIntent.FLAG_UPDATE_CURRENT);
notification.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)

发送通知请求

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



实现自定义的通知栏效果:

这里要用到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.自定义带按钮通知栏(如下样式)

正在进行的

“正在进行的”通知使用户了解正在运行的后台进程。例如,音乐播放器可以显示正在播放的音乐。也可以用来显示需要长时间处理的操作,例如下载或编码视频。“正在进行的”通知不能被手动删除。

Notification.Builder builder = new Notification.Builder(
						NotifcationActivity.this);
				builder.setSmallIcon(R.drawable.letongdesklogo);
				builder.setTicker("hello word");
				builder.setWhen(System.currentTimeMillis());
				builder.setDefaults(Notification.DEFAULT_ALL);
				builder.setAutoCancel(true);
				Intent intent = new Intent(NotifcationActivity.this,
						Demo2A.class);
				PendingIntent pendingIntent = PendingIntent.getActivity(
						NotifcationActivity.this, 0, intent,
						PendingIntent.FLAG_UPDATE_CURRENT);
				RemoteViews reViews = new RemoteViews(getPackageName(),
						R.layout.notify_item);
				reViews.setTextViewText(R.id.msg, "自定义通知");
				reViews.setTextViewText(R.id.open_activity2, "点击打开");
				reViews.setImageViewResource(R.id.icon, R.drawable.icon1);
				reViews.setOnClickPendingIntent(R.id.notify_lay, pendingIntent);
				builder.setContent(reViews);
				builder.setContentIntent(pendingIntent);
				Notification notification = builder.build();
				NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
				notificationManager.notify(2, notification);
或者

  //先设定RemoteViews  
        RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.view_custom);  
        //设置对应IMAGEVIEW的ID的资源图片  
        view_custom.setImageViewResource(R.id.custom_icon, R.drawable.icon);  
//      view_custom.setInt(R.id.custom_icon,"setBackgroundResource",R.drawable.icon);  
        view_custom.setTextViewText(R.id.tv_custom_title, "今日头条");  
        view_custom.setTextViewText(R.id.tv_custom_content, "金州勇士官方宣布球队已经解雇了主帅马克-杰克逊,随后宣布了最后的结果。");  
demo下载地址

http://download.youkuaiyun.com/detail/vipzjyno1/7348889

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值