Android—提醒式通知的显示与限制

提醒式通知也称为横幅通知或悬浮通知,适用于用户应该立即知晓的通知,它会短暂地悬浮在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实现。

推荐阅读更多精彩内容