在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括:
通知渠道:Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。要了解如何实现通知渠道的信息,请参阅通知渠道指南。
通知标志:Android 8.0 引入了对在应用启动器图标上显示通知标志的支持。通知标志可反映某个应用是否存在与其关联、并且用户尚未予以清除也未对其采取行动的通知。通知标志也称为通知点。要了解如何调整通知标志,请参阅通知标志指南。
休眠:用户可以将通知置于休眠状态,以便稍后重新显示它。重新显示时通知的重要程度与首次显示时相同。应用可以移除或更新已休眠的通知,但更新休眠的通知并不会使其重新显示。通知超时:现在,使用 setTimeoutAfter()
创建通知时您可以设置超时。您可以使用此函数指定一个持续时间,超过该持续时间后,通知应取消。如果需要,您可以在指定的超时持续时间之前取消通知。
通知设置:当您使用 Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
Intent 从通知创建指向应用通知设置的链接时,您可以调用 setSettingsText()
来设置要显示的文本。此系统可以提供以下 Extra 数据和 Intent,用于过滤应用必须向用户显示的设置:EXTRA_CHANNEL_ID
、NOTIFICATION_TAG
和 NOTIFICATION_ID
。
通知清除:系统现在可区分通知是由用户清除,还是由应用移除。要查看清除通知的方式,您应实现 NotificationListenerService
类的新 onNotificationRemoved()
函数。
背景颜色:您现在可以设置和启用通知的背景颜色。只能在用户必须一眼就能看到的持续任务的通知中使用此功能。例如,您可以为与驾车路线或正在进行的通话有关的通知设置背景颜色。您还可以使用 Notification.Builder.setColor()
设置所需的背景颜色。这样做将允许您使用 Notification.Builder.setColorized()
启用通知的背景颜色设置。消息样式:现在,使用 MessagingStyle
类的通知可在其折叠形式中显示更多内容。对于与消息有关的通知,您应使用 MessagingStyle
类。您还可以使用新的 addHistoricMessage()
函数,通过向与消息相关的通知添加历史消息为会话提供上下文。
正文部分:
如果将编译版本设置26以上且未进行Android O的适配会导致在Android O以上的手机无法弹出通知栏。简单的适配只需要针对通知渠道:NotificationChannel进行版本判断处理。8.0以上需要使用NotificationCompat.Builder(@NonNull Context context, @NonNull String channelId)方法
官方github的Demo:https://github.com/googlesamples/android-NotificationChannels
直接上具体代码:
private final int pushId = 1;
public static final String PRIMARY_CHANNEL = "default";
NotificationManager mNotificationManager = (NotificationManager) Utils.getContext().getSystemService(Utils.getContext().NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder;
//判断是否是8.0Android.O
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel chan1 = new NotificationChannel(PRIMARY_CHANNEL,
"Primary Channel", NotificationManager.IMPORTANCE_DEFAULT);
chan1.setLightColor(Color.GREEN);
chan1.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
mNotificationManager.createNotificationChannel(chan1);
mBuilder = new NotificationCompat.Builder(Utils.getContext(), PRIMARY_CHANNEL);
} else {
mBuilder = new NotificationCompat.Builder(Utils.getContext());
}
Intent notificationIntent = new Intent(Utils.getContext(), MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(Utils.getContext(), 0,
notificationIntent, 0);
mBuilder.setContentTitle(senderStr)//设置通知栏标题
.setContentText(contentStr)//设置通知栏内容
.setContentIntent(intent) //设置通知栏点击意图
// .setNumber(++pushNum) //设置通知集合的数量
.setTicker(senderStr + ":" + contentStr) //通知首次出现在通知栏,带上升动画效果的
.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
.setDefaults(Notification.DEFAULT_ALL)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
.setSmallIcon(R.mipmap.ic_launcher);//设置通知小ICON
Notification notify = mBuilder.build();
notify.flags |= Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(pushId, notify);