Broadcast Receiver的onReceive()失效,Android Monitor无日志问题求助
嘿,我之前在小米设备上碰到过类似的BroadcastReceiver失效问题,尤其是电话相关的场景,给你梳理几个针对性的排查方向,应该能解决你的问题:
小米Redmi 3s上CallReceiver不工作的排查方案
1. 先搞定MIUI的后台权限限制
小米的MIUI系统对后台应用管控特别严格,默认会限制非白名单应用接收系统广播:
- 打开手机「设置」→「权限管理」→「自启动管理」,找到你的应用,把自启动开关拉满,允许它后台自启动。
- 再去「省电优化」→「应用省电策略」,把你的应用设置为「无限制」,别用智能省电或超级省电模式——不然系统会在后台悄悄杀掉应用,广播自然接收不到。
2. 确认电话权限是否真的生效
Android 6.0及以上版本,电话相关权限需要动态申请,哪怕Manifest里配置了也没用:
- 你得在代码里主动申请
READ_PHONE_STATE(监听来电状态)、PROCESS_OUTGOING_CALLS(监听去电)这类权限,申请成功后再测试广播。简单的代码示例如下:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 100); }
- 也可以手动去「设置」→「权限管理」→「应用权限」,找到你的应用,确认「电话」权限是完全允许的状态。
3. 再核对一遍Manifest的广播配置细节
虽然你说配置无异常,但电话广播的细节很容易踩坑:
- 监听来电的action是
android.intent.action.PHONE_STATE,监听去电是android.intent.action.NEW_OUTGOING_CALL,别写错了。 - 一定要把receiver的
exported属性设为true,因为系统广播是从外部调用你的接收器:
<receiver android:name=".CallReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>
4. 解决日志看不到的问题
小米设备的Logcat经常会过滤掉应用日志,你可以这么处理:
- 在Android Studio的Logcat面板里,把过滤器从「Show only selected application」改成「No Filters」,或者直接搜索你的应用包名,就能找到对应的日志了。
- 也可以在
onReceive()方法里加个Toast提示:Toast.makeText(context, "广播触发啦!", Toast.LENGTH_SHORT).show(),不用看日志也能直观判断广播是否被调用。
5. 测试时的小细节
- 测试别立刻清理应用进程,小米的一键清理会直接杀掉应用,导致广播接收器失效。
- 尽量用真实的电话测试(比如用另一台手机打过来/拨出去),模拟器的电话模拟有时候会有兼容性问题。
按照这些步骤排查下来,大部分小米设备上的广播失效问题都能解决——毕竟MIUI的权限管控是重灾区,先把自启动和省电策略放开,基本就能解决八成问题。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

