参考文献:
ASleepyCoder的Android Notification常见样式总结文章
vipra的Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
本文主要知识点概要:
- 通知(Notification)的简单使用
- 通知(Notification)的一些常用的设置方法
- 通知(Notification)的进阶使用
- 通知(Notification)的常见问题
1. 简单使用
- 创建一个NotificationManager对通知进行管理
- 通过一个构建器来创建一个Notification对象
1.1创建一个NotificationManager对象
NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
通过NotificationManager来管理通知内容;
1.2创建一个Notification对象
这个对象是通过构建者模式创建的,这里先贴代码,之后我在详细讲解常用的方法:
NotificationCompat.Builder nb = new NotificationCompat.Builder(this, "1");
nb.setContentTitle("通知的标题栏");
nb.setContentText("通知栏内容");
nb.setWhen(System.currentTimeMillis());
nb.setSmallIcon(R.drawable.ic_stat_name);
nb.setTicker("状态栏中提示的内容");
nb.setDefaults(Notification.DEFAULT_VIBRATE);
Notification notification = nb.build();
mManager.notify(1,notification);
通过以上方法就可以成功的创建一个通知了,这里面具体的设置方法我在后面会详细讲解。
2.一些常用的设置方法
2.1当你创建通知的时候会使用到NotificationCompat来构建一个通知.常用到的方法如下:
- setContentTitle("") 设置通知的标题
- setContentText("") 设置通知的内容
- setSmallIcon(R.mipmap.XXX) 设置通知显示的小图片(这里要注意,如果你设置的图片过大的话会抛出一个异常)这里注意小图标必须有,否则不显示通知
- setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.XXX)) 设置通知右下角显示的图片,这里面说的是是大图标,但是我在我的手机上却显示在右边,但是如果你设置一个较大的图片的时候,虽然不会报错,但是不会显示,当我不去设置smallIcon的时候,设置这个的时候整个通知栏都不显示了.其实当只设置smallIcon没有设置LargeIcon的时候,SmallIcon的图标将会出现在LargeIcon的位置,而小图标的位置将不会有图标,但两者同时设置的时候LargeIcon将会出现在LargeIcon位置,SmallIcon也会出现在SmallIcon的位置.
- setTicker("") 设置状态栏的提示内容
- setContentIntent(pendingIntent) 设置通知栏点击既执行的意图,和Intent的作用类似,但是写法不同.
这里说明下里面的参数:PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,XXX.class), 0);
- 参数1 上下文
- 参数2 请求码
- 参数3 intent对象
- 参数4 这个是一个flag表示位,会有一下几种
- FLAG_ONE_SHOT 表示这个意图只可以使用一次,后续的通知单击后无法打开
- FLAG_NO_CREATE 发现已经存在时,忽略新的请求,继续使用老的,日常开发中很少使用
- FLAG_CANCEL_CURRENT 如果新请求的PendingIntent发现已经存在时,取消已经存在的,用心的替换老的
- FLAG_UPDATE_CURRENT 如果新情求的PendingIntent发现已经存在时,如果Intent有字段改变了,就更新已存在的PendingIntent
- setNumber(int) 设置通知及和的数量(没见到别人用过)
- setWhen(System.currentTImeMillis()) 设置通知产生的时间,会在通知信息里显示,一般时系统获取到的时间,如果不去设置取系统的时间
- setPriority(Notification.PRIORITY_DEFAULT) 设置通知的优先级,这个优先级是从-2~2 这里设置的是默认的是0(一般是在广播中设置这个属性),这里写一下你可以设置的参数吧:
- Notification.PRIORITY_DEFAULT 默认
- Notification.PRIORITY_HIGH 高
- Notification.PRIORITY_LOW 低
- Notification.PRIORITY_MAX 最高
- Notification.PRIORITY_MIN 最低
- setAutoCancel(boolean) 用户点击该通知,是否关闭此条通知
- setOngoning(boolean) 点击或者侧滑通知,通知是否会消失,一般利用它都是设置一个正在运行的通知,如音乐播放或者下载进度等一些特殊的场景,要设置成true
- setDefaults(Notification.DEFAULT_VIBRATE) 给通知添加声音,闪灯和震动效果,可以组合使用,具体参数为
- Notification.DEFAULT_VIBRATE 添加默认震动提醒
- Notification.DEFAULT_SOUND 添加默认声音提醒
- Notification.DEFAULT_LIGHTS 添加默认三色灯提醒
- Notification.DEFAULT_ALL 添加默认以上3种全部提醒
- setVibrate(long[] pattern) 设置自定义震动模式 如:setVibrate(new long[] {0,200,200,300});//延迟0秒,然后震动200ms,在延迟200ms,接着震动300ms
- setLights(int RGB,int onTime,int lowLight) 设置自定义灯光,这里说明一下参数和注意事项
- 参数1: RGB灯光颜色
- 参数2: 亮持续的时间
- 参数3: 暗持续的时间
- 注意: 只有在设置了标识符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才支持三色灯提醒
- setSound(Uri music) 设置自定义音乐 如:setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
- setProgress(int max,int progress,boolean indeterminare) 设置带进度条的通知,这里说一下参数3,代表进度是否确定,当确定的时候是具体的progress,但是不确定的时候是连续的短线.
- addAction(int icon, CharSequence title, PendingIntent intent) 添加一个点击后出现的按钮,添加多了会出现一排图标,最多可以添加5个.并且每个都能设置相应的点击事件.这个最好看后面的3.2讲的内容,说下参数,参数1:图标的资源id,参数2:图标显示的名称,参数3:图标对应要启动的PendingIntent
2.2当你创建通知的时候会使用到Notification.常用到的方法如下:
当你使用builder构建出一个Notification的时候,也可以更改一些参数:
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 表示正在运行的服务
3.进阶使用
3.1 自定义的通知栏效果(RemoteViews)
Notification的自定义布局是RemoteViews,和其他RemoteViews一样,在自定义视图布局文件中,仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件。否则会引起ClassNotFoundException异常
一般的步骤如下:
- 创建自定义视图
- 获取远程视图对象
- 设置PendingIntent来相应事件
- 发起Notification
3.1.1自定义带按钮的通知栏
-
创建自定义视图,这里的布局就是一个随便的布局,但是其实你写太大也没有用,这个后面讲.
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_custom_button);
-
获取远程视图对象
这里说明一下,前面那个ID是视图中定义的ID,其实这里设置所有内容,都需要根据ID匹配,然后进行设置的,也算是提供的方法了,这里就不要去纠结了.-
设置图片
remoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.ic_launcher_background);
-
设置监听事件
remoteViews.setOnClickPendingIntent(R.id.btn_1, pendingIntent);
-
设置相应的pendingIntent,其实和上面设置PendingIntent的方法一样,这里就不去写了.
-
发起Notification
Notification notification = builder.setContent(remoteViews) .setWhen(System.currentTimeMillis()) .setTicker("正在播放") .setSmallIcon(R.drawable.ic_stat_name) .build(); notification.flags = Notification.FLAG_AUTO_CANCEL; mManager.notify(2, notification);
其实别的方法都差不多,就是这里注意一下涉及资源的时候,其他的都是一样的.
3.1.2不带按钮的通知栏
其实和上面的都差不多,只是没有的相应的PendingIntent,多了一个设置文字的方法,这里就直接贴代码了!
//先设定RemoteViews
RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.custom);
//设置对应IMAGEVIEW的ID的资源图片
view_custom.setImageViewResource(R.id.custom_icon, R.drawable.icon);
view_custom.setTextViewText(R.id.custom_title, "标题");
view_custom.setTextViewText(R.id.custom_content, "显示的内容");
3.2大图风格通知(4.1之前的版本不支持此功能)
只有在通知栏被展开时显示,何时展开呢?通知栏处在顶端,或者用户通过手势展开的时候显示.分为几种效果,但是写法其实都差不多,下面说说这几种风格,其实这些风格,比普通视图多出一个详情区域!
- NotificationCompat.BigPictureStyle 大图片风格:详情区域包含一个256dp高度的位图
- NotificationCompat.BigTextStyle 大文字风格:显示一个大的文字块
- NotificationCompat.InboxStyle 收件箱风格:显示多行文字
- NotificationCompat.MediaStyle 音乐风格:显示音乐风格(这个风格特殊说明一下, 出现的是一些列的图标,可以给相应的图标设置相应的事件,这些事件是添加到相应的NotificationCompat.Builder.setStyle()去添加的,最多可以添加5个),这个类是v7包下的
但是这个详情区域出现的方式各不相同,我的手机是按住下拉,有的手机是点击之后出现,有的是直接出现,这里自己多尝试一下就知道了!
3.2.1各个版本中的公共方法和各自的方法
先说一下公共方法!
- setBigContentTitle("") 大通知栏的标题
- setSummaryText("") 末尾只一行的文字内容
其他都是单独存在的方法!
- NotificationCompat.BigPictureStyle
- bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.small)) 添加一张相应的图片
- NotificationCompat.BigTextStyle
- bigText() 添加相应文字的方法
- NotificationCompat.InboxStyle
- addLine("") 直接添加每行的显示内容
-NotificationCompat.MediaStyle - setMediaSession(new MediaSessionCompat(this,"MediaSession",new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
- setCancelButtonIntent(pendingIntent) 在5.0以下有效,设置取消后的意图
- setShowCancelButton(boolean) 会在通知栏的右上部分显示一个删除图标5.0一下有效
- setShowActionInCompactView(2,3) 添加action所在的action组的数组的下标,从0开始,低版本上也可以显示
- addLine("") 直接添加每行的显示内容
这个我觉得应该贴一下代码了!
private void mediaStyle(){
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle("MediaStyle");
builder.setContentText("Song Title");
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
Intent intent = new Intent(this,ImageActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
builder.setContentIntent(pIntent);
//第一个参数是图标资源id 第二个是图标显示的名称,第三个图标点击要启动的PendingIntent
builder.addAction(R.drawable.ic_previous_white,"",null);
builder.addAction(R.drawable.ic_stop_white,"",null);
builder.addAction(R.drawable.ic_play_arrow_white_18dp,"",pIntent);
builder.addAction(R.drawable.ic_next_white,"",null);
NotificationCompat.MediaStyle style = new NotificationCompat.MediaStyle();
style.setMediaSession(new MediaSessionCompat(this,"MediaSession",
new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
//CancelButton在5.0以下的机器有效
style.setCancelButtonIntent(pIntent);
style.setShowCancelButton(true);
//设置要现实在通知右方的图标 最多三个
style.setShowActionsInCompactView(2,3);
builder.setStyle(style);
builder.setShowWhen(false);
Notification notification = builder.build();
manger.notify(TYPE_Media,notification);
}
最后通过NotificationCompat.Builder.setStyle()设置进去就可以了
4.类似与QQ的在手机屏幕顶端出现的通知(只有在5.0以上系统中有效哦)
NotificationCompat.Builder.setFullScreenIntent(pIntent,true);
4.常见的问题
4.1如何取消掉通知栏上的通知
- 设置相应的flags = FLAG_AUTO_CANCEL
- 通过手动调用NotificationManager.cancle()方法关闭指定的通知或者通过NotificationManager.cancleAll()关闭所有通知.
关于常见的问题,等到以后用到的时候在去好好总结以下,现在总结的话或许会不那么完全,当你读到这篇文章后,要是有什么问题请和我联系,我会及时帮助你解决的,也能促进自己的提高...