在开始正文之前,我觉得有必要明确下【后台弹出界面】权限的由来,这个权限来自小米官方于 2019 年发布的一则《关于默认关闭“后台弹出页面”权限的通知》,该权限旨在限制多种三方应用随意从后台弹出页面,进行各种传播、引导、广告等操作。并且,该权限默认是拒绝的,即应用默认不允许在后台弹出页面,并会针对特殊应用提供白名单。
这个权限在限制恶意行为的同时,也限制了一些合理的行为。例如,我们希望在 APP 中内置调试页面,当程序出现 BUG 时可以通过 Secret Code 的方式唤起该页面,以获取必要的调试信息。然而,由于小米系统中“后台弹出界面”权限默认是拒绝的,使得调试页面无法被正常唤起。
1. 调试页面
先来看下调试信息页面的唤起方式,也就是 Secret Code 的实现方式。首先,需要实现一个广播接收者,并在 onReceive
方法中增加启动调试信息页的逻辑。其次,需要在清单文件的 <application>
节点下增加广播接收者的注册信息,并在 <intent-filter>
节点配置 Secret Code 的相关信息。
1 | /*** 实现广播接收者,打开页面组件 ***/ |
1 | /*** 注册广播接收者,配置过滤信息 ***/ |
2. 日志分析
唤起逻辑实现完毕后,运行程序至小米手机(MIUI 12.5.5稳定版),在电话拨号界面输入*#*#2022#*#*
,调试信息页面并没有被唤起,日志窗口会出现如下日志:
1 | MIUILOG- Permission Denied Activity : Intent { flg=0x10000000 cmp=com.sunzn.secret/.SecretActivity } pkg : com.sunzn.secret uid : 10672 tuid : 10229 |
这条日志的意思是没有启动对应 Activity 的权限。经查,只有小米/OPPO/VIVO手机上会禁止后台弹出界面,因为这些厂商从系统层面禁止了这个动作。
3. 解决方案
3.1 手动开启权限
依次打开【应用信息】-【权限管理】-【后台弹出界面】进行授权,授权允许后,重新打开电话拨打界面输入*#*#2022#*#*
,调试信息页面被成功唤起。
3.2 程序判断引导
针对 MIUI 系统判断是否拥有【后台弹出界面】的权限,如果不拥有该权限,跳转至权限设置界面引导用户开启该权限。
1 | /*** 针对小米系统,判断是否具备后台弹出界面权限 ***/ |