android – 某些应用程序如何阻止/替换单挑通知?

背景

自从在Android上出现单挑通知以来,一些人喜欢它的快速处理,但有些人讨厌它在应用程序(尤其是游戏)之上展示.

为了显示单挑通知,开发人员可以使用类似的东西:

final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setContentTitle("aa").setContentText("bb").setTicker("cc")
            .setColor(0xffff0000).setSmallIcon(R.mipmap.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
            .setPriority(Notification.PRIORITY_HIGH);
    if (Build.VERSION.SDK_INT >= 21)
        builder.setVibrate(new long[0]);
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1,builder.build());

因此,一些应用程序提出了显示以某种方式替换它们的滚动条文本通知的想法,就像在单挑通知之前一样:

https://play.google.com/store/apps/details?id=com.jamworks.noheadsup&hl=en

有各种可能有用的场景.例如,对于使用全屏的游戏,它可能是有用的.那是因为如果用户要按顶部区域并显示抬头通知,我们希望避免意外点击此通知.

问题

我不仅无法找到人们如何做到的方式,而且似乎它不再适用于Android的新版本(在Android 7上测试过).

我发现阻止通知的唯一应用是这样的:
https://play.google.com/store/apps/details?id=com.aboutmycode.NotificationsOff&hl=en

但它没有将抬头通知转换为“正常”通知.相反,它只是阻止它们.此外,它需要root,似乎只是将通知的设置更改为“已阻止”.

这个问题

是否可以临时阻止抬头通知(并将其转换为没有抬头通知的那些)?如果是这样,怎么样?

它有哪些限制?没有root可以工作吗?如果有可能与root,怎么样? “NotificationsOff”如何运作?

也许这种能力以前是可能的,但现在不是吗?

解决方法

在Android 18上有一个 NotificationListenerService.当显示新通知时,会通知此服务.然后,我知道有三种方法可以采取行动:

>拦截通知,使其不显示(不完全确定可以完成)检查:如果NotificationListenerService在收到通知时未调用super.xxx,则还会显示通知.所以这种方法似乎行不通.
>在发布时清除通知.为此,您可以使用NotificationManager清除给定通知或clearAllNotifications已检查:它部分用于清除通知,但您仍然看到通知显示,然后它不在通知区域(这是奇怪的效果).
>在API 21 Lollipop中,您似乎可以覆盖NotificationListenerService#getCurrentInterruptionFilter().此方法可以返回NotificationListenerService #INTERRUPTION_FILTER_NONE(或任何其他常量),(尚未测试,应该验证).选中:NotificationListenerService#getCurrentInterruptionFilter()是final,因此无法覆盖.
>在API 23中,您可以使用NotificationManager#setNotificationPolicy()NotificationManager#setInterruptionFilter()(按特定顺序)来控制向用户显示哪些通知. Permissions are required用于那些API.请注意,此方法似乎是方便访问功能,但跳过实现完整的NotificationListenerService.这是唯一可以令人满意的方式工作的选择

关于NotificationListenerService,您可以在GitHub kpbird/NotificationListenerService-Examplepost中看到以下示例.

关于NotificationManager,请参阅this post in StackOverflow (specially interesting the highlighted comment)和此post中的其他信息.

示例,测试和其他说明

我已经使用基于kpbird的示例上传了以下repository to GitHub,以测试所有假设并提供最终结论.

请注意,必须遵循应用程序能够访问通知的following steps to enable the permission才能使应用程序正常运行.此答案还提供了在正确的部分中打开系统设置的方法.

此外,为了完整起见,following answer提供了一种检查权限是否已被授予的方法.

附加说明:显然,Marshmallow的第一个版本有一个错误,其中NotificationManager#setInterruptionFilter()不起作用.见herehere.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...