通知推送Notification
在手机屏幕的顶端下拉会弹出通知栏,里面存放的是App即时提醒用户的消息,消息内容由Notification 产生并推送。每条消息通知基本都有图标、标题、内容、时间等元素,参数通过Notification.Builder构建。 下面来看常用的参数构建方法。
- setWhen:设置推送时间,格式为“小时:分钟”。推送时间在通知栏右方显示。
- setShowWhen:设置是否显示推送时间。
- setUsesChronometer:设置是否显示计数器。为true时不显示推送时间,动态显示从通知被推送到当前的时间间隔,以“分钟:秒钟”格式显示。
- setSmallIcon:设置状态栏里面的图标(小图标)。
- setTicker:设置状态栏里面的提示文本。
- setLargeIcon:设置通知栏里面的图标(大图标)。
- setContentTitle:设置通知栏里面的标题文本。
- setContentText:设置通知栏里面的内容文本。
- setSubText:设置通知栏里面的附加说明文本,位于内容文本下方。若调用该方法,则setProgress的 设置失效。
- setProgress:设置进度条与当前进度。进度条位于标题文本与内容文本中间。
- setNumber:设置通知栏右下方的数字,可与setProgress联合使用,表示当前的进度数值。
- setContentInfo:设置通知栏右下方的文本。若调用该方法,则setNumber的设置失效。
- setContentIntent:设置内容的延迟意图PendingIntent,点击该通知时触发该意图。通常调用 PendingIntent的getActivity方法获得延迟意图对象,
- getActivity表示点击后跳转到该页面。
- setDeleteIntent:设置删除的延迟意图PendingIntent,滑掉该通知时触发该动作。
- setAutoCancel:设置该通知是否自动清除。若为true,则点击该通知后,通知会自动消失;若为 false,则点击该通知后,通知不会消失。
- setContent:设置一个定制的通知栏视图RemoteViews,用于取代Builder的默认视图模板。
- build:构建方法。在以上参数都设置完毕后,调用该方法返回Notification对象。
使用以上设置方法要注意4点: (1)setSmallIcon方法必须调用,否则不会显示通知消息。 (2)setWhen与setUsesChronometer同时只能调用其中一个,即推送时间与计数器无法同时显示,因为 它们都位于通知栏右边。 (3)setSubText与setProgress同时只能调用其中一个,因为附加说明与进度条都位于标题文本下方。 (4)setNumber与setContentInfo同时只能调用其中一个,因为计数值与提示都位于通知栏右下方。
使用Notification只能生成通知内容,实际推送动作还需借助系统的通知服务实现。NotificationManager 是系统通知服务的管理类,有以下3个常用方法。 notify:推送指定消息到通知栏。 cancel:取消指定消息。调用该方法后,通知栏中的指定消息将消失。 cancelAll:取消所有消息。
进度条ProgressBar
消息通知Notification的setProgress方法是对内置进度条进行操作,不过很多时候进度条会单独使用,有必要了解一下ProgressBar的具体用法。 下面来看进度条的常用属性。
- style:指定进度条的形状样式。?android:attr/progressBarStyleHorizontal表示水平形状,? android:attr/progressBarStyle表示圆圈形状。
- max:指定进度条的最大值。 progress:指定进度条当前进度值。
- secondaryProgress:指定进度条当前次要进度值。比如播放视频,progress用来表示当前播放进度, secondaryProgress用来表示当前缓冲进度。
- progressDrawable:指定进度条的进度图形。
进度条的常用方法有以下9个。
- setProgress:设置当前进度。
- getProgress:获取当前进度。
- setSecondaryProgress:设置次要进度。
- getSecondaryProgress:获取次要进度。
- setMax:设置进度条的最大值。
- getMax:获取进度条的最大值。
- incrementProgressBy:设置当前进度的增量。
- incrementSecondaryProgressBy:设置次要进度的增量。
- setProgressDrawable:设置进度条的进度图形。
使用进度条时需要注意以下两点: (1)max、progress的相关属性和方法只在样式为progressBarStyleHorizontal时才有效,即水平进度条可 动态设置进度值;如果样式为progressBarStyle圆圈形状,最大值与进度值的设置就会失效,即圆圈形状不 会显示当前进度,只会兀自旋转。想实现动态显示进度的进度条,可参考6.2节的圆弧进度动画。 (2)progressDrawable进度图形不能用普通图形,只能用层次图形LayerDrawable。层次图形可在XML 文件中定义,如果用于描述进度图形就要同时定义两个层次,即背景层次与进度条层次。例如,在自定义 圆弧动画时运用了背景视图与前景视图,在进度条中就存在背景层次,只不过前景视图换成了进度条层 次。 ??下面是一个层次图形定义的XML例子。其中,根节点layer-list表示这是一个层次列表,即层次图形定 义;背景层次的id为@android:id/background,采用的是形状图形(节点名称为shape);进度条层次的id为 @android:id/progress,采用的是裁剪图形ClipDrawable(节点名称为clip):
远程视图RemoteViews
前面介绍Notification的常用方法时提到setContent方法可以在设置定制的通知栏视图RemoteViews时取代Builder的默认视图模板。 虽然RemoteViews与Activity一样有自己的布局文件,但是RemoteViews的使用 权限小了很多。两者的区别主要有: (1)RemoteViews主要用于通知栏部件和桌面部件,而Activity用于页面。 (2)RemoteViews只支持少数几种控件,如TextView、ImageView、Button、ImageButton、 ProgressBar、Chronometer(计时器)和AnalogClock(模拟时钟)。 (3)RemoteViews不可直接获取和设置控件信息,只能通过该对象的set方法修改控件信息。 下面来看远程视图的常用方法。 构造函数:创建一个RemoteViews对象。第一个参数是包名,第二个参数是布局文件id。
- setViewVisibility:设置指定控件是否可见。
- setViewPadding:设置指定控件的间距。
- setTextViewText:设置指定TextView或Button控件的文字内容。
- setTextViewTextSize:设置指定TextView或Button控件的文字大小。
- setTextColor:设置指定TextView或Button控件的文字颜色。
- setTextViewCompoundDrawables:设置指定TextView或Button控件的文字周围图标。
- setImageViewResource:设置ImageView或ImgaeButton控件的资源编号。
- setImageViewBitmap:设置ImageView或ImgaeButton控件的位图对象。
- setChronometer:设置计时器信息。
- setProgressBar:设置进度条信息,包括最大值与当前进度。
- setOnClickPendingIntent:设置指定控件的点击响应动作。
自定义通知的文本颜色设定
开发者根本无法辨别哪些手机改了通知栏的背景,甚至都无从获知背景色是什么,也就没法在代码里面判断并处理。幸好Android在系统的资源文件中配置了统一风格,像通知栏标题颜色,其实 是从系统资源文件获取对应的色值。对Android4.*系统来说,通知栏的标题色取自系统的“? android:attr/textColorPrimary”;对于Android5.0及以上的系统,通知标题的文字风格android:textAppearance取自系统的“@android:style/TextAppearance.Material.Notification.Title”。这样一来,在自定义通知的时候,开发者可以将标题文字颜色设置为系统默认的标题色。于是系统通知拥有什么文本颜色(可能是黑底白字也可 能是白底黑字),开发者自定义的通知也是什么文本颜色,从而一劳永逸解决了通知栏的标题颜色与背景 颜色的适配问题。
具体到App开发的适配工作上面,则需进行以下操作步骤: (1)首先打开res\values目录下面的styles.xml,在resources节点内部添加如下所示的风格配置,表示定义一个采取系统默认标题色的字体风格:  (2)其次在res目录下新建一个文件夹values-v21,再在该文件夹下新建一个styles.xml,并往该XML文件填入下列的风格配置代码:  新文件夹values-v21用于适配版本代码不低于21的Android系统,即Android5.0及更高版本的系统。倘若 当前手机运行的是Android4.*,则App运行的时候,系统会自动到values目录下寻找相应的资源配置;倘若当前手机运行的是Android5.0或者更高版本,则系统会优先在values-v21目录下查找资源,有找到就用这里的资源,没找到再用values目录下的资源。 (3)最后回到自定义通知对应的布局文件,找到标题文本控件,去掉对文字颜色android:textColor的属 性设置,再添加一行对控件风格style的属性设置。 修改完毕,这下不管系统通知栏默认的是黑底白字,还是默认白底黑字,自定义消息的标题文本都能 自动变色啦。
|