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

如何让TelephonyCallback.SignalStrengthsListener在熄屏状态下正常工作?

解决API 31中TelephonyCallback.SignalStrengthsListener熄屏失效的问题
  • 补全必要权限:API 31及以上版本,除了在Manifest中声明ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、READ_PHONE_STATE权限,必须通过运行时请求获取这些权限。部分设备还要求开启ACCESS_BACKGROUND_LOCATION权限——哪怕前台服务在运行,熄屏后系统仍可能判定应用处于后台,触发该权限检查。

  • 调整回调注册时机:别只在onCreate里注册回调,建议移到前台服务的onStartCommand中完成,同时在服务销毁时务必注销回调,避免内存泄漏。示例代码:

private TelephonyManager telephonyManager;
private TelephonyCallback telephonyCallback;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    telephonyCallback = new TelephonyCallback() {
        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);
            // 这里写信号强度变化的处理逻辑
        }
    };
    if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
        telephonyManager.registerTelephonyCallback(getMainExecutor(), telephonyCallback);
    }
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (telephonyManager != null && telephonyCallback != null) {
        telephonyManager.unregisterTelephonyCallback(telephonyCallback);
    }
}
  • 突破厂商系统限制:国产ROM(小米、华为、OPPO等)常有额外后台管控,即便关闭电池优化、开了前台服务,仍可能限制SignalStrengthsListener的触发。需要在应用权限设置里开启「自启动」「后台弹出界面」,并把后台模式设为「无限制」。

  • 规范WakeLock使用:确保WakeLock是PARTIAL_WAKE_LOCK类型,服务运行期间保持锁定,不要提前释放。示例:

private PowerManager.WakeLock wakeLock;

@Override
public void onCreate() {
    super.onCreate();
    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::SignalStrengthLock");
    wakeLock.acquire(); // 或指定超时时间,比如10分钟:10*60*1000L
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (wakeLock != null && wakeLock.isHeld()) {
        wakeLock.release();
    }
}
  • 用adb命令测试回调:可以通过adb模拟信号强度变化,快速验证回调是否正常工作:
adb shell dumpsys telephony.registry set signalstrength 99 31 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

内容的提问来源于stack exchange,提问作者PT007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:39:58