DevSupport鱼乐Android

通知栏Notification的详细使用

2017-10-18  本文已影响363人  HEXG_

转载自:http://blog.csdn.net/vipzjyno1/article/details/25248021

在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

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

对应属性(作用看上图就可知道):

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幅图所示

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

效果图如下:

可以看出,它支持多种相应方式,有Activity、Broadcast、Service,就根据你自身需求去选择。

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

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

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

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

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


Intent intent =newIntent(context,XXX.class);

PendingIntent pendingIntent = PendingIntent.getActivity(context,0, intent,0);

mBuilder.setContentIntent(pendingIntent)


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

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


Intent deleteIntent =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());


拓展

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

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

正在进行的

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

实现方法如下:


/**

* 带按钮的通知栏

*/

publicvoidshowButtonNotify(){

NotificationCompat.Builder mBuilder =newBuilder(this);

RemoteViews mRemoteViews =newRemoteViews(getPackageName(), R.layout.view_custom_button);

mRemoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.sing_icon);

//API3.0 以上的时候显示按钮,否则消失

mRemoteViews.setTextViewText(R.id.tv_custom_song_singer,"周杰伦");

mRemoteViews.setTextViewText(R.id.tv_custom_song_name,"七里香");

//如果版本号低于(3。0),那么不显示按钮

if(BaseTools.getSystemVersion() <=9){

mRemoteViews.setViewVisibility(R.id.ll_custom_button, View.GONE);

}else{

mRemoteViews.setViewVisibility(R.id.ll_custom_button, View.VISIBLE);

}

//

if(isPlay){

mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.drawable.btn_pause);

}else{

mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.drawable.btn_play);

}

//点击的事件处理

Intent buttonIntent =newIntent(ACTION_BUTTON);

/* 上一首按钮 */

buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PREV_ID);

//这里加了广播,所及INTENT的必须用getBroadcast方法

PendingIntent intent_prev = PendingIntent.getBroadcast(this,1, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);

mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_prev, intent_prev);

/* 播放/暂停  按钮 */

buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PALY_ID);

PendingIntent intent_paly = PendingIntent.getBroadcast(this,2, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);

mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_play, intent_paly);

/* 下一首 按钮  */

buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_NEXT_ID);

PendingIntent intent_next = PendingIntent.getBroadcast(this,3, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);

mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_next, intent_next);

mBuilder.setContent(mRemoteViews)

.setContentIntent(getDefalutIntent(Notification.FLAG_ONGOING_EVENT))

.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示

.setTicker("正在播放")

.setPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级

.setOngoing(true)

.setSmallIcon(R.drawable.sing_icon);

Notification notify = mBuilder.build();

notify.flags = Notification.FLAG_ONGOING_EVENT;

mNotificationManager.notify(notifyId, notify);

}


注意:带按钮的布局相应点击事件在3.0以下版本没有用,所以这边作了系统版本判断,来显示消失按钮。

2.自定义不带按钮通知栏

实现方法如下:


//先设定RemoteViews

RemoteViews view_custom =newRemoteViews(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,"金州勇士官方宣布球队已经解雇了主帅马克-杰克逊,随后宣布了最后的结果。");


之后调用:


mBuilder.setContent(view_custom)


来设定自定义的这个布局。

实现:大视图风格通知(注:4.1之前的版本不支持大视图)

只在通知被展开时显示

何时展开:通知处在顶端,或者用户通过收拾展开

收件箱风格的通知:

相比普通视图,只多出:7. 详情区域

效果图如下:

解决方案:

由于2.3及之前版本,背景设是白色的那我们定义字体颜色为系统预设的颜色:


?android:attr/textColorPrimary


在资源的src/values目录中的style.xml文件中设置它标题和内容的样式为:

在2.3之后的版本中(即API >=9的版本中),在资源文件下的src/values-v9目录中的style.xml文件中设置它标题和内容的样式为:

最后赋给自定义布局中的对应标题和内容对应的style即可。

对应解决网址:

1.http://stackoverflow.com/questions/6250356/how-to-use-default-notification-style

2.http://stackoverflow.com/questions/4867338/custom-notification-layouts-and-text-colors/7320604#7320604

3.http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView   (官方文档)

http://developer.android.com/about/versions/android-2.2-highlights.html

6.低版本中mBuilder.setProgress(100, progress, false);没用,不显示进度条

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

7.自定义布局的时候,不同版本方法不一样。(弄了半天,在2.3版本不显示,原来是方法不兼容)

2.3及2.3之前:

通过


Notification notify = mBuilder.build();

notify.contentView = view_custom;

mNotificationManager.notify(notifyId, notify)


方法赋予VIEW。

2.3之后:

通过Builder以下方法赋于自定义布局。

mBuilder.setContent(view_custom)

DEMO截图:

DEMO下载:下载地址

上一篇 下一篇

猜你喜欢

热点阅读