如何在检测到特定事件时弹出我的应用程序?

How to make my app pop up when I detect a certain event?

注:原发于Android Enthusiasts Stack Exchange但现在移至此处,因为off-topic那里

Kaspersky Safe Kids,一个家长控制应用程序,有一个功能,它会在每次检测到 child 不打算执行的事件时弹出(打开一个应用程序,打开与其相关的任何内容)设置,搜索 Google 和 Youtube 上禁止的内容——有趣的是,它在其他 Chromium-based 浏览器上不起作用)。我一直在试图弄清楚它如何检测我自己的应用程序的事件,但通常的罪魁祸首如权限 GET_TASKS 和 READ_LOGS 已贬值(我正在尝试定位,卡巴斯基致力于, Android 10+).对于实际的覆盖,我认为它使用SYSTEM_ALERT_WINDOW,但在我自己在模拟器中的实验中,当我撤销该权限时,它仍然能够弹出。那么,它是如何工作的,它们(我猜其他类似的控制和生产力应用程序)有什么权限?

该应用程序是设备管理员,因此这可能会发挥作用,但查看 permissions 设备管理员拥有的权限,其中 none 看起来像卡巴斯基拥有的权限。

编辑: 在评论中,Mike M. 指出该应用程序使用辅助功能服务(不知道我是怎么错过的),这是有道理的,因为辅助功能允许您做很多事情,包括展示你自己的 UI。巧合的是,对应用程序本身的评论指出该过程在随机时间结束(虽然不确定是哪个过程),可能是因为它没有被列入白名单。然后我看了一下它的权限,这个很突出:android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。此权限允许将其列入白名单,以便省电模式不会终止后台进程。对于可访问性本身,android.permission.BIND_ACCESSIBILITY_SERVICE 是用于授予它的权限(为了记录,您必须使用 adb shell appops set com.kaspersky.safekids android.permission.BIND_ACCESSIBILITY_SERVICE [allow|ignore|deny],而不是 adb shell pm [grant|revoke] com.kaspersky.safekids android.permission.BIND_ACCESSIBILITY_SERVICE(尽管可能必须替换 android with Manifest) as BIND_ACCESSIBILITY_SERVICE 是签名权限。为了完整起见,对于 Admin,它是 android.permission.BIND_DEVICE_ADMIN

我能够使用 ADB OTG 缩小使用的确切权限范围(我附近没有电脑,所以我使用了备用 Pixel)我做到了 appops set com.kaspersky.safekids BIND_ACCESSIBILITY_SERVICE ignore(我相信 deny 也可以)。重新启动它,不再弹出。将 ignore 更改为 allow,然后重新启动,它再次起作用。