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

Android锁屏状态下如何启动服务并正常显示来电悬浮窗

Android 锁屏状态下来电悬浮窗无法弹出的解决思路

亮屏状态功能正常说明联系人读取、来电监听、基础悬浮窗渲染逻辑没有问题,故障核心是Android系统对锁屏场景的窗口展示、进程权限做了分层限制,按以下步骤逐一排查修复即可:

1. 补全悬浮窗窗口的锁屏相关Flag配置

窗口参数配置缺失是最常见的原因,在初始化WindowManager.LayoutParams时补充对应Flag,同时注意不同系统版本的悬浮窗类型适配:

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 基础悬浮窗类型适配
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
    params.type = WindowManager.LayoutParams.TYPE_PHONE;
}
// 锁屏显示相关Flag
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
    params.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
    params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
} else {
    params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
}
// 其余宽高、布局、触摸逻辑的参数保持原有配置即可

2. 补齐场景所需的全部权限

仅申请基础悬浮窗权限不足以支持锁屏场景展示,需要在AndroidManifest.xml中声明以下权限,同时引导用户手动开启对应授权:

  • 基础权限:SYSTEM_ALERT_WINDOW(悬浮窗权限,需要用户手动跳转到设置页开启)、READ_CONTACTS(读取联系人)、READ_PHONE_STATE(监听电话状态)、WAKE_LOCK(唤醒屏幕权限)
  • 版本适配权限:Android 12+ 需声明USE_FULL_SCREEN_INTENT(允许应用在锁屏状态下触发来电类通知/窗口);Android 13+ 需声明POST_NOTIFICATIONS(通知权限,否则前台服务无法正常启动)

注意:小米、华为、OPPO、vivo等厂商的自定义ROM在原生权限逻辑之外新增了独立的锁屏拦截规则,仅声明系统权限无法绕过,必须在应用内做适配引导:

  • 引导用户开启应用的「锁屏显示」权限
  • 引导用户开启应用的「后台弹出界面」权限
  • 引导用户将应用加入电池优化白名单,关闭后台耗电限制,避免锁屏后进程被冻结

3. 提升进程优先级,避免锁屏后组件被系统拦截

锁屏状态下系统会压低后台应用的调度优先级,甚至直接冻结进程,需要做以下处理:

  • 不要仅依赖静态广播监听来电状态,启动一个绑定电话状态监听器的前台服务,服务启动时调用startForeground()绑定常驻通知,将进程优先级提升到前台级别,避免被系统回收。
  • 来电触发时如果检测到当前为锁屏状态,先通过PowerManager申请短暂唤醒锁点亮屏幕,延迟100-200ms后再在主线程执行悬浮窗添加逻辑,给系统窗口调度留足缓冲时间,避免窗口添加失败。
  • 读取联系人信息的逻辑提前在子线程完成,不要在主线程做耗时操作,锁屏状态下系统对后台应用主线程的调度资源有限,耗时操作会导致窗口加载超时被丢弃。

4. 常见踩坑排查

  • 不要在广播接收器的onReceive()方法里直接执行悬浮窗添加逻辑,该方法回调生命周期最长只有10秒,部分ROM下还会在子线程回调,必须切到应用主线程执行窗口操作。
  • 不要使用废弃的窗口类型(比如旧版本的TYPE_SYSTEM_ALERT、TYPE_TOAST),高版本系统下这类窗口类型会被直接拦截,不允许在锁屏展示。
  • 测试时不要用系统自带的「强制停止」功能杀掉应用,该状态下应用的所有广播、服务都会被系统拦截,重启一次设备即可恢复正常状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:27:19