先来一段发送普通通知的代码。
NotificationManager notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getActivity(),CHANNEL_ID)
.setSmallIcon(R.drawable.icon_notice)
.setContentTitle("标题")
.setContentText("内容内容内容,内容内容内容,内容内容内容")
.setAutoCancel(true)
.setSound(defaultSoundUri)
notificationManager.notify(notifiId, notificationBuilder.build());
我们来看看通知在各个版本上的表现(Genymotion模拟器)
分析发现
Android 通知栏分成三个不同样式
Android 5.0以下版本Android 5.0和6.0版本
Android 7.0以上版本
发现5.0以上版本的状态图标都变成了白块,通知栏也显示异常。
因为Android 5.0以上状态栏图标只能是白色图案,如果使用了有背景色的图片,那么会被直接填充为白色导致显示不出来。
解决方式
1、将 targetSdkVersion 修改到 21 以下,将不会这种问题。
2、分版本进行兼容
1.对于Android 5.0 以下的版本,直接可以使用原图标。
2.对于Android 5.0以上的版本。需要将通知图标修改为透明底的图片,且修改通知背景颜色。
.setSmallIcon(R.drawable.icon_notice_temp)
.setColor(Color.RED)
得到的效果为发现7.0以上通知的文字颜色也变了,这不好看,所以7.0以上判断不要设置背景颜色,得到效果就好看多了。
试了一下
setLargeIcon(BitmapFactory.decodeResource(mActivity.getResources(), R.drawable.icon_notice))
得到这样的效果左下角出现了小图标,这并不是我想要的样子。
顺带提一下Android 8.0需要增加通知渠道,不然通知无法显示
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@SuppressLint("WrongConstant")
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
channel.setDescription(description);
channel.setLightColor(Color.RED);
channel.enableVibration(true);
channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
notificationManager.createNotificationChannel(channel);
}
附上实现的关键代码
//增加一個渠道,ID不重复即可
String CHANNEL_ID = "159753";
String CHANNEL_NAME = "渠道名";
String description = "渠道说明";
int notifiId = (int) System.currentTimeMillis();
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationManager notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
//Android 8.0需要增加渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@SuppressLint("WrongConstant")
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
channel.setDescription(description);
channel.setLightColor(Color.RED);
channel.enableVibration(true);
channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getActivity(),CHANNEL_ID);
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.LOLLIPOP){
//如果是小于5.0系统的,设置原图
notificationBuilder.setSmallIcon(R.drawable.icon_notice);
}else{
//如果是大于等于5.0系统的,设置透明图
notificationBuilder.setSmallIcon(R.drawable.icon_notice_temp);
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N){
//如果小于7.0系统,设置背景色
notificationBuilder.setColor(Color.RED);
}
}
notificationBuilder.setContentTitle("标题");
notificationBuilder.setContentText("内容内容内容,内容内容内容,内容内容内容");
notificationBuilder.setAutoCancel(true);
notificationBuilder.setSound(defaultSoundUri);
notificationBuilder.setContentIntent(null);
notificationManager.notify(notifiId, notificationBuilder.build());