Flutter中如何检测当前打开的前台应用(如Instagram)
核心结论
没有全平台通用的无权限实现方案,能不能做完全取决于你要适配的系统,以及你能拿到的用户授权等级。
Android端可行实现路径
Android端可以实现,但是必须引导用户开启特殊权限,目前有两种稳定可落地的方案:
- 方案1:使用应用使用统计权限(适配所有正规分发场景)
调用系统UsageStatsManager接口查询当前前台应用包名,匹配到Instagram的包名com.instagram.android时触发本地通知即可。
实现步骤:- 引入
usage_stats插件,在Manifest里声明PACKAGE_USAGE_STATS权限 - 启动检测前先判断权限是否开启,没开的话跳转到系统「应用使用情况访问」设置页引导用户手动授权
- 引入
workmanager插件注册定时任务,每隔15-30秒查询一次当前前台应用,避免主进程被系统杀死后检测中断 - 匹配到Instagram包名时,调用
flutter_local_notifications弹出本地通知
注意:这个权限不是普通运行时权限,没法弹系统级授权框,必须引导用户跳设置页手动开,轮询间隔不要设得短于10秒,否则会被系统判定为异常耗电强制杀进程。
- 引入
- 方案2:使用无障碍服务权限(实时性更高,适合非商店分发场景)
注册无障碍服务监听窗口状态变化事件,可以实时拿到当前聚焦的应用包名,检测延迟比轮询UsageStats低很多。但是这个权限敏感度很高,如果你的应用核心功能不是面向残障用户的辅助功能,上架Google Play时大概率会被拒审,只适合自用或者企业内部分发的场景。
避坑提醒:Android 10及以上版本已经完全封禁了普通应用读取/proc进程目录、获取运行中任务列表等不需要特殊权限的前台应用检测方式,所有声称不需要特殊权限就能实现的方案都是过时无效的,不用浪费时间测试。
iOS端实现限制
普通上架App Store的应用完全没有可行方案。iOS沙箱机制严格禁止应用读取其他App的运行状态,公开API没有提供任何相关接口,不要尝试用私有API绕限制,审核时100%会被拒。
唯一的例外是你开发的是企业MDM类应用,通过企业部署证书拿到设备全量管理权限,才可以获取设备上的应用运行状态,但这类应用不允许上架公开App Store,只能在企业内部网络分发使用。
额外场景说明
如果你只需要检测「从你自己的App跳转到Instagram」的场景,不需要做全局前台检测,直接注册Instagram的URL Scheme监听跳转事件即可,但是这种方式没法检测用户从桌面、其他应用打开Instagram的行为。
内容的提问来源于stack exchange,提问作者kvvisony
相关产品推荐
相关产品推荐

