You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:08:28