Android Notification常见样式总结
本文总结一下开发中使用的Notification的常见样式
Demo下载地址
demo里有两首歌和打包后的apk,所以比较大,如果网不好下载请耐心!
代码中用的自定义常量
public static final int TYPE_Normal = 1; public static final int TYPE_Progress = 2; public static final int TYPE_BigText = 3; public static final int TYPE_Inbox = 4; public static final int TYPE_BigPicture = 5; public static final int TYPE_Hangup = 6; public static final int TYPE_Media = 7; public static final int TYPE_Customer = 8; private NotificationManager manger = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
所需权限
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.FLASHLIGHT"/>
一.普通通知
这是最常见通知样式,如下图
这里写图片描述
这里写图片描述
举例
private void simpleNotify(){ //为了版本兼容 选择V7包下的NotificationCompat进行构造 NotificationCompat.Builder builder = new NotificationCompat.Builder(this); //Ticker是状态栏显示的提示 builder.setTicker("简单Notification"); //第一行内容 通常作为通知栏标题 builder.setContentTitle("标题"); //第二行内容 通常是通知正文 builder.setContentText("通知内容"); //第三行内容 通常是内容摘要什么的 在低版本机器上不一定显示 builder.setSubText("这里显示的是通知第三行内容!"); //ContentInfo 在通知的右侧 时间的下面 用来展示一些其他信息 //builder.setContentInfo("2"); //number设计用来显示同种通知的数量和ContentInfo的位置一样,如果设置了ContentInfo则number会被隐藏 builder.setNumber(2); //可以点击通知栏的删除按钮删除 builder.setAutoCancel(true); //系统状态栏显示的小图标 builder.setSmallIcon(R.mipmap.ic_launcher); //下拉显示的大图标 builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push)); Intent intent = new Intent(this,SettingsActivity.class); PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0); //点击跳转的intent builder.setContentIntent(pIntent); //通知默认的声音 震动 呼吸灯 builder.setDefaults(NotificationCompat.DEFAULT_ALL); Notification notification = builder.build(); manger.notify(TYPE_Normal,notification); }
build内提供了很多设置,但是在不同的系统版本显示有很多差异,使用时需要注意
setTicker 通知到来时低版本上会在系统状态栏显示一小段时间 5.0以上版本好像没有用了 setContentInfo和setNumber同时使用 number会被隐藏 setSubText显示在通知栏的第三行文本,在低版本上不显示,比如4.0系统 setVibrate设置震动 参数是个long[]{震动时长,间隔时长,震动时长,间隔时长...}单位毫秒 设置提醒声音 setSound(Uri sound) 一般默认的就好 builder.setLights()设置呼吸灯的颜色 并不是所有颜色都被支持 个人感觉没什么用 清除通知栏特定通知 manager.cancel(id) id即为manger.notify()的第一个参数
二.下载进度的通知
效果图
这里写图片描述
代码举例
NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.mipmap.ic_launcher); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push)); //禁止用户点击删除按钮删除 builder.setAutoCancel(false); //禁止滑动删除 builder.setOngoing(true); //取消右上角的时间显示 builder.setShowWhen(false); builder.setContentTitle("下载中..."+progress+"%"); builder.setProgress(100,progress,false); //builder.setContentInfo(progress+"%"); builder.setOngoing(true); builder.setShowWhen(false); Intent intent = new Intent(this,DownloadService.class); intent.putExtra("command",1); Notification notification = builder.build(); manger.notify(MainActivity.TYPE_Progress,notification);
注意事项
setProgress的第三个bool类型的参数表示progressbar的Indeterminate属性 指是否使用不确定模式 高版本上progressbar的进度值可以在setContentInfo显示,但是低版本上使用这个属性会导致progressbar不显示,setContentText一样
三.BigTextStyle通知
点击后展开可显示大段文字内容的通知
效果图
点击前
这里写图片描述
点击后
这里写图片描述
代码举例
private void bigTextStyle(){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle("BigTextStyle"); builder.setContentText("BigTextStyle演示示例"); builder.setSmallIcon(R.mipmap.ic_launcher); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification)); android.support.v4.app.NotificationCompat.BigTextStyle style = new android.support.v4.app.NotificationCompat.BigTextStyle(); style.bigText("这里是点击通知后要显示的正文,可以换行可以显示很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长"); style.setBigContentTitle("点击后的标题"); //SummaryText没什么用 可以不设置 style.setSummaryText("末尾只一行的文字内容"); builder.setStyle(style); builder.setAutoCancel(true); Intent intent = new Intent(this,SettingsActivity.class); PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0); builder.setContentIntent(pIntent); builder.setDefaults(NotificationCompat.DEFAULT_ALL); Notification notification = builder.build(); manger.notify(TYPE_BigText,notification); }
注意事项
使用类 android.support.v4.app.NotificationCompat.BigTextStyle 在低版本系统上只显示点击前的普通通知样式 如4.4可以点击展开,在4.0系统上就不行 点击前后的ContentTitle、ContentText可以不一致,bigText内容可以自动换行 好像最多5行的样子
四.InboxStyle
与bigTextStyle类似,点击前显示普通通知样式,点击后展开
效果图 (点击后)
这里写图片描述
代码举例
public void inBoxStyle(){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle("InboxStyle"); builder.setContentText("InboxStyle演示示例"); builder.setSmallIcon(R.mipmap.ic_launcher); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification)); android.support.v4.app.NotificationCompat.InboxStyle style = new android.support.v4.app.NotificationCompat.InboxStyle(); style.setBigContentTitle("BigContentTitle") .addLine("第一行,第一行,第一行,第一行,第一行,第一行,第一行") .addLine("第二行") .addLine("第三行") .addLine("第四行") .addLine("第五行") .setSummaryText("SummaryText"); builder.setStyle(style); builder.setAutoCancel(true); Intent intent = new Intent(this,SettingsActivity.class); PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0); builder.setContentIntent(pIntent); builder.setDefaults(NotificationCompat.DEFAULT_ALL); Notification notification = builder.build(); manger.notify(TYPE_Inbox,notification); }
注意事项
使用类android.support.v4.app.NotificationCompat.InboxStyle 每行内容过长时并不会自动换行 addline可以添加多行 但是多余5行的时候每行高度会有截断 同BigTextStyle 低版本上系统只能显示普通样式
五.BigPictureStyle
点击后可以显示一个大图的通知
效果图(点击后)
这里写图片描述
代码举例
public void bigPictureStyle(){
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(“BigPictureStyle”);
builder.setContentText(“BigPicture演示示例”);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
android.support.v4.app.NotificationCompat.BigPictureStyle style = new android.support.v4.app.NotificationCompat.BigPictureStyle();
style.setBigContentTitle(“BigContentTitle”);
style.setSummaryText(“SummaryText”);
style.bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.small));
builder.setStyle(style);
builder.setAutoCancel(true);
Intent intent = new Intent(this,ImageActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
//设置点击大图后跳转
builder.setContentIntent(pIntent);
Notification notification = builder.build();
manger.notify(TYPE_BigPicture,notification);
}
注意事项
使用类android.support.v4.app.NotificationCompat.BigPictureStyle style.bigPicture传递的是个bitmap对象 所以也不应该传过大的图 否则会oom 同BigTextStyle 低版本上系统只能显示普通样式
六.hangup横幅通知
类似于手机QQ消息的通知,不显示在通知栏而是以横幅的模式显示在其他应用上方
效果图
这里写图片描述
代码示例
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(“横幅通知”);
builder.setContentText(“请在设置通知管理中开启消息横幅提醒权限”);
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
Intent intent = new Intent(this,ImageActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
builder.setContentIntent(pIntent);
//这句是重点
builder.setFullScreenIntent(pIntent,true);
builder.setAutoCancel(true);
Notification notification = builder.build();
manger.notify(TYPE_Hangup,notification);
注意事项
此种效果只在5.0以上系统中有效 mainfest中需要添加<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 可能还需要在设置开启横幅通知权限(在设置通知管理中) 在部分改版rom上可能会直接弹出应用而不是显示横幅
七.MediaStyle
主要是用来关联音频播放服务的,点击后不会自动消失,通知栏的清空也不可用
效果图
点击前
这里写图片描述
点击展开后
这里写图片描述
在4.0系统上的效果 不能展开但是可以最多显示3个按钮外加一个CancelButton
这里写图片描述
代码示例
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); }
注意事项
使用类v7包下的NotificationCompat.MediaStyle addAction方法并普通样式也可以用,使用后普通通知可以点击展开,展开部分会显示一排添加的图标,并且可以给每个图标设置不同的点击事件 最多可以添加5哥action 并排显示在点击展开的部分 setShowActionsInCompactView的参数是添加的action在所有action组成的数组中的下标,从0开始 setShowActionsInCompactView设置的action会显示在点击前的通知的右侧,低版本上也可以显示 setShowCancelButton(true)会在通知的右上部分显示一个删除图标 5.0以下有效
八.自定义通知栏布局
其实就是设置一个romateViews
演示效果
这里写图片描述
代码示例
//command是自定义用来区分各种点击事件的 private void sendCustomerNotification(int command){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle("Notification"); builder.setContentText("自定义通知栏示例"); builder.setSmallIcon(R.mipmap.ic_launcher); //builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push)); builder.setAutoCancel(false); builder.setOngoing(true); builder.setShowWhen(false); RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.notification_template_customer); remoteViews.setTextViewText(R.id.title,"Notification"); remoteViews.setTextViewText(R.id.text,"song"+index); if(command==CommandNext){ remoteViews.setImageViewResource(R.id.btn1,R.drawable.ic_pause_white); }else if(command==CommandPlay){ if(playerStatus==StatusStop){ remoteViews.setImageViewResource(R.id.btn1,R.drawable.ic_pause_white); }else{ remoteViews.setImageViewResource(R.id.btn1,R.drawable.ic_play_arrow_white_18dp); } } Intent Intent1 = new Intent(this,MediaService.class); Intent1.putExtra("command",CommandPlay); //getService(Context context, int requestCode, @NonNull Intent intent, @Flags int flags) //不同控件的requestCode需要区分开 getActivity broadcoast同理 PendingIntent PIntent1 = PendingIntent.getService(this,5,Intent1,0); remoteViews.setOnClickPendingIntent(R.id.btn1,PIntent1); Intent Intent2 = new Intent(this,MediaService.class); Intent2.putExtra("command",CommandNext); PendingIntent PIntent2 = PendingIntent.getService(this,6,Intent2,0); remoteViews.setOnClickPendingIntent(R.id.btn2,PIntent2); Intent Intent3 = new Intent(this,MediaService.class); Intent3.putExtra("command",CommandClose); PendingIntent PIntent3 = PendingIntent.getService(this,7,Intent3,0); remoteViews.setOnClickPendingIntent(R.id.btn3,PIntent3); builder.setContent(remoteViews); Notification notification = builder.build(); manger.notify(MainActivity.TYPE_Customer,notification); }
布局文件

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android自定义View探索(三)—事件分发机制与滑动冲突处理
View的事件分发机制,其实就是对MotionEvent事件的分发机制,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,这个传递的过程就是分发过程。 一.View的事件分发机制 整体流程: dispatchTouchEvent()—>onTouch()—>onTouchEvent()—>onClick() dispatchTouchEvent():View事件分发的入口,返回值表示MotionEvent是否被消费。 onTouch():View需要处理事件时,如果它设置了onTouchListener,那么onTouchListener中的onTouch方法会被调用。如果onTouch方法返回false,那么View的onTouchEvent()方法会被调用;如果onTouch方法返回true,那么View的onTouchEvent()方法将不会被调用。onTouch()的优先级比onTouchEvent()的优先级更高。 onTouchEvent():View自身对于Touch处理的实现 ,返回结果表示是否消耗当前事件。 onC...
- 下一篇
Android 推送 整合小米、个推、jpush
Android系统由google提供的推送的服务在国内并不能很好的运作,因此不能像iOS能提供统一管理的推送服务。Android端推送目前常用的都是第三方推送服务,也可以自己搭建推送服务器来实现, 为了节约开发成本,目前主流的提供第三方推送服务的有:极光推送、个推、友盟、小米推送、百度推送等。 Android端推送分为通知,透传两种,通知是有通知栏显示的,透传由用户自定义处理,可以做静默,也可以自定义通知栏显示,个性化程度较高,点击的逻辑处理也比较方便。 iOS端推送的话,应用程序在前台的时候,推送通知有程序处理,当应用程序在后台的时候,由系统统一处理推送消息,此时可以配置静默推送,来处理通知栏的显示与否,这一点和Android一样,但是由于是系统统一处理,所以到达率有保证,这一点android端就比较麻烦了。 本文将整合小米、个推、极光推送,从而提高app推送的到达率。实践发现,由于Android系统的差异性,在Android单独使用某一个推送并不能很好的完成推送服务。原因就是因为某些厂商的android系统安全性比较高,当完全杀死进程后,将无法收到推送服务(例如小米、魅族)。需要用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块