提醒式通知也称为横幅通知或悬浮通知,适用于用户应该立即知晓的通知,它会短暂地悬浮在Window上,等到显示时间耗尽或者用户上划后消失,随后仍显示在通知抽屉中。
提醒式通知的应用非常广泛,QQ/微信的消息通知,支付宝的交易记录都会以提醒式通知的形式出现。不过Android的官方文档上并没有明确表示该如何触发提醒式通知,而是给出了以下模糊的描述。
以下情况可能会触发提醒式通知:
1 用户的 Activity 处于全屏模式(应用使用 fullScreenIntent)。
2 通知的优先级很高,且在搭载 Android 7.1(API 级别 25)及更低版本的设备上使用铃声或振动。
3 在搭载 Android 8.0(API 级别 26)及更高版本的设备上,通知渠道的重要程度比较高。
也就是说,开发者没办法调用特定的方法显示提醒式通知,而是系统根据通知的重要性去判断是否作为提醒式通知展示。而国内的APP大多没什么节操,大多喜欢直接使用最高优先级,这种粗暴的方式会极大地伤害用户体验,因此系统一般默认关闭提醒式通知。而像微信等APP,手机厂商默认是允许提醒式通知的,这是国民级APP的特权。
下面以MIUI12系统为例,看一下如何才能展示提醒式通知。首先打开“悬浮通知”设置,该选项位于应用的“通知管理”界面。在该界面还能看到“通知类别”选项,该选项中的每一个类别对应一个NotificationChannel
,而只有某个通知渠道的重要程度为“紧急”时才会显示提醒式通知。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (mNotificationChannel == null) {
mNotificationChannel = new NotificationChannel(
DOWNLOAD_CHANNEL_ID, DOWNLOAD_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
mNotificationChannel.setShowBadge(true);
mNotificationChannel.setLightColor(Color.BLUE);
mNotificationChannel.enableVibration(false);
notificationManager.createNotificationChannel(mNotificationChannel);
}
mNotification = new NotificationCompat.Builder(context, DOWNLOAD_CHANNEL_ID)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setDefaults(Notification.DEFAULT_ALL)
.setOngoing(true)
.setAutoCancel(true)
.setContentTitle(title)
.setContentText(content)
.build();
}
可以发现NotificationChannel
的重要性被设置为了NotificationManager.IMPORTANCE_HIGH
,其对应“通知管理”中的“紧急”,但如果用户手动调整该通知的重要性,那也无法显示提醒式通知。由于提醒式通知的限制较多,如果有类似需求,可以考虑通过WindowManager
实现。