notification即通知在开发中很常见,在开发中我们根据需求要实现各种各样的通知,如普通通知、进度条通知、可展开的通知、媒体通知、自定义布局的通知。本篇文章就来讲解这些通知的实现。
普通通知
为了兼容性我们用v7包下的NotificationCompat 来实现通知,这个类是继承了·v4包下的NotificationCompat。下面先写一个简单的通知,再慢慢讲解。
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//标题
builder.setContentTitle("通知标题");
//内容
builder.setContentText("通知内容");
//副内容,文本摘要,
builder.setSubText("文本摘要\n哈哈哈");
//ContentInfo 在通知的右侧 时间的下面 用来展示一些其他信息
builder.setContentInfo("info");
//number设计用来显示同种通知的数量和ContentInfo的位置一样,如果设置了ContentInfo则number会被隐藏;测试发现在android 7.0版本及以上是不显示contentinfo和number的
builder.setNumber(5);
//小图标
builder.setSmallIcon(R.mipmap.me_pressed);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.reward_normal);
//大图标
builder.setLargeIcon(bitmap);
//是否会自动取消通知,ture的话点击就会取消掉,false就不会;不管设置true或false都会被通知栏里的删除按钮删除掉
builder.setAutoCancel(true);
//新消息提示,在5.0及以上版本没有效果
builder.setTicker("你有新通知");
//设置默认提示音、震动、呼吸灯
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
//自定义提示声音,第一个参数是音频文件,第二个参数是声音类型
// builder.setSound(Uri.parse(""), NotificationCompat.STREAM_DEFAULT);
//自定义震动 表示在100、300、500、700开始或者停止震动
// long []vibrates={100,300,500,700};
// builder.setVibrate(vibrates);
//自定义呼吸灯 参数分别是颜色,呼吸灯显示时间300ms,呼吸灯关闭时间100ms
// builder.setLights(0x00ff00,300,100);
//android 5.0开始通知可以显示在锁屏上
//VISIBILITY_PRIVATE:显示基本信息,隐藏内容
//VISIBILITY_PUBLIC显示全部信息
//VISIBILITY_SECRET不显示任何信息
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
//通知时间,默认是System.currentTimeMillis()
builder.setWhen(System.currentTimeMillis());
Intent intent = new Intent();
intent.setAction("android.liu.xin.notification");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//点击通知后的意图可以是activity、service、broadcast
builder.setContentIntent(pendingIntent);
if (notificationManager == null) {
notificationManager= (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
}
// 显示通知,第一个参数是通知id,第二个是通知notification
notificationManager.notify(110, builder.build());
//可以通过这个通知id,通过代码移除通知
//notificationManager.cancel(int id);
//或者notificationManager.cancelAll()移除所有通知
这就实现了一个普通的通知,通知显示效果如下图(各个android版本显示效果都有所差别):
这个是华为 android 7.0上的显示效果
这个是android 5.0虚拟机显示的效果
通知必须要设置小图标,否则会报错,标题和内容也应该设置,不然没啥意义,没有设置是空的。如果通知设置了activity的点击意图,在应用退出的情况下,点击通知到那个Activity再按返回键默认是返回桌面的。
那怎么设置可以让它返回到指定界面呢?可以通过以下代码进行设置:
<!--第一步在配置文件中,点击通知要跳转到那个Activity添加以下配置
这个是android 4.1及以上设置点返回键后要调的Activity
android:parentActivityName=".SplashActivity"
tools:targetApi="jelly_bean"
在android4.1以下设置 点返回键后要调的Activity:
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value=".SplashActivity"/>
-->
<activity android:name=".NotificationActivity"
android:parentActivityName=".SplashActivity"
tools:targetApi="jelly_bean">
<intent-filter>
<action android:name="android.liu.xin.notification"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value=".SplashActivity"/>
</activity>
//第二步再通过以下代码设置 TaskStackBuilder是android4.1才添加的api
Intent intent = new Intent();
intent.setAction("android.liu.xin.notification");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotificationActivity.class);
stackBuilder.addNextIntent(intent);
pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
} else {
pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
//点击后的意图
builder.setContentIntent(pendingIntent);
这个只有在android4.1及以上按返回键才生效。
进度条通知
通过NotificationCompat.Builder的setProgress(int max,int progress,boolean indeterminate)方法来进行设置进度条,第一个参数是进度最大值,第二个参数是进度,第三个参数是是否是不明确的进度。
在Demo中我写了一个后台下载应用,可以在通知中查看下载进度的功能。下面是部分代码:
int progress = intent.getIntExtra("progress", 0);
boolean iscomplet = intent.getBooleanExtra("iscomplete", false);
int isSuccess = intent.getIntExtra("isSuccess", 0);
if (notificationManager == null || progressBuilder == null) {
notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
progressBuilder = new NotificationCompat.Builder(context);
//取消显示通知时间
// progressBuilder.setShowWhen(false);
progressBuilder.setTicker("下载中...");
progressBuilder.setContentTitle("下载进度" + progress + "%");
progressBuilder.setSmallIcon(R.mipmap.me_pressed);
if (isSuccess == 1) {
//设置进度条
progressBuilder.setProgress(100, progress, false);
if (iscomplet) {
progressBuilder.setContentText("下载完成");
progressBuilder.setAutoCancel(true);
//设置是否是正在执行的通知,true的画就不能通过滑动或删除按钮删除
progressBuilder.setOngoing(false);
progressBuilder.setContentIntent(installApk(context));
} else {
progressBuilder.setAutoCancel(false);
progressBuilder.setOngoing(true);
}
} else {
//取消进度条
progressBuilder.setProgress(0, 0, false);
progressBuilder.setContentText("下载失败");
progressBuilder.setAutoCancel(true);
progressBuilder.setOngoing(false);
}
} else {
progressBuilder.setContentTitle("下载进度" + progress + "%");
if (isSuccess == 1) {
progressBuilder.setProgress(100, progress, false);
if (iscomplet) {
progressBuilder.setContentText("下载完成");
progressBuilder.setAutoCancel(true);
progressBuilder.setOngoing(false);
progressBuilder.setContentIntent(installApk(context));
} else {
progressBuilder.setAutoCancel(false);
progressBuilder.setOngoing(true);
}
} else {
progressBuilder.setProgress(0, 0, false);
progressBuilder.setContentText("下载失败");
progressBuilder.setAutoCancel(true);
progressBuilder.setOngoing(false);
}
}
notificationManager.notify(120, progressBuilder.build());
效果如图:
可展开的通知
可展开的通知有可展开的文本通知、可展开的图片通知、可展开的媒体通知。通过 NotificationCompat.Builder的setStyle()方法实现。支持android4.1及以上版本,在android4.1以下不显示展示的内容
BigTextStyle
可扩展文本通知
NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();
//展开后的标题
bigTextStyle.setBigContentTitle("展开后的标题");
//这个setSubText很像。在android7.0它们显示的位置一样。两者都设置了只会显示setSubText
bigTextStyle.setSummaryText("最后的总结");
//设置可展开的文本
bigTextStyle.bigText("展开后的内容解决解决军军军军军军军军军军军军军军军军军军军军军军军军军军军绝大多数少了SDK滴滴代驾开始了快速谁送的"
);
builder1.setStyle(bigTextStyle);
InboxStyle
可扩展文本通知
1. 每行内容过长时并不会自动换行
2. addline可以添加多行 测试发现只显示7行
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.addLine("第一行");
inboxStyle.addLine("第二行");
inboxStyle.addLine("第三行");
inboxStyle.addLine("第四行");
inboxStyle.addLine("第五行");
inboxStyle.addLine("第六行");
inboxStyle.addLine("hjsdjkddddddddddddddddddddsdjkhddhdhhdh哈哈哈1订单的点点滴滴多");
inboxStyle.addLine("第七行");
inboxStyle.addLine("第八行");
inboxStyle.addLine("第九行");
inboxStyle.addLine("第十行");
inboxStyle.addLine("第十一行");
inboxStyle.setSummaryText("通知总结");
inboxStyle.setBigContentTitle("展开通知标题");
builder2.setStyle(inboxStyle);
MediaStyle
媒体通知,类似音乐播放器上的通知
//addAction方法也可以在普通样式用,使用后普通通知可以点击展开,展开部分会显示一排添加的图标,并且可以给每个图标设置不同的点击事件(PendingIntent) addAction支持android4.1及以上。
// 最多可以添加5哥action 并排显示在点击展开的部分
builder5.addAction(R.mipmap.pre, "", null);
builder5.addAction(R.mipmap.start, "", null);
builder5.addAction(R.mipmap.next, "", null);
builder5.addAction(R.mipmap.me_pressed,"",null);
builder5.addAction(R.mipmap.reward_normal,"",null);
builder5.addAction(R.mipmap.ic_launcher,"",null);
NotificationCompat.MediaStyle mediaStyle = new NotificationCompat.MediaStyle();
//设置没展开时显示哪几个action 这里显示的是第0、1、2个
mediaStyle.setShowActionsInCompactView(0,1, 2);
//设置删除按钮意图 android5.0以下有效
mediaStyle.setCancelButtonIntent(pendingIntent1);
//设置是否显示删除按钮 android5.0以下有效
mediaStyle.setShowCancelButton(true);
mediaStyle.setMediaSession(new MediaSessionCompat(this, "mediaSession", new ComponentName(this, Intent.ACTION_MEDIA_BUTTON), null).getSessionToken());
builder5.setStyle(mediaStyle);
builder5.setStyle(mediaStyle);
效果图:
横幅
横幅支持android5.0及以上版本,需要添加悬浮框权限。有的机型可能不适配
builder4.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
//第一个参数横幅跳的意图,第二个是设置是否是高优先级
builder4.setFullScreenIntent(pendingIntent5, true);
通过以上代码设置可以横幅显示
效果图:
总结
通知就先介绍到这里了,下篇文章介绍RomoteViews和自定义通知。