如何实现应用保持屏幕常亮并显示在锁屏之上?
实现类似谷歌地图的锁屏上方显示+屏幕常亮功能
刚好我之前研究过类似的需求,谷歌地图的这个功能其实是结合了几个Window Flag、系统权限和版本适配逻辑来实现的,我给你拆解一下具体步骤:
一、保持屏幕常亮(两种省心实现方式)
你提到的getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)确实可行,但还有一种更不用手动管理的方式——直接在布局文件中设置属性:
<!-- 在根布局添加该属性,系统会自动处理生命周期的Flag状态 --> <LinearLayout ... android:keepScreenOn="true"> </LinearLayout>
两种方式效果一致,布局属性的方式更推荐,不用担心忘记在onPause时移除Flag的问题。
二、核心:实现锁屏上方显示+无需解锁直接操作
这部分是关键,需要结合不同Android版本的API来处理:
1. 声明必要权限
在AndroidManifest.xml中添加低版本系统需要的解锁权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
2. 基础Window Flag配置(通用)
在Activity的onCreate()或onResume()方法中添加以下Flag,确保应用能在锁屏状态下显示:
Window window = getWindow(); // 保持屏幕常亮 window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 允许锁屏时在屏幕上方显示应用 window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); // 自动解除锁屏(Android 10及以下版本有效) window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); // 如果需要主动唤醒屏幕(比如导航触发时点亮屏幕),可以加上这个Flag window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
3. Android 10(API 29)及以上版本适配
从Android 10开始,FLAG_DISMISS_KEYGUARD被废弃,需要使用KeyguardManager的API来请求解锁:
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); if (keyguardManager.isKeyguardLocked()) { // 请求系统解除锁屏 keyguardManager.requestDismissKeyguard(this, new KeyguardManager.KeyguardDismissCallback() { @Override public void onDismissSucceeded() { // 解锁成功后的逻辑,比如恢复导航状态 } @Override public void onDismissError() { // 解锁失败的处理,比如提示用户手动解锁 } }); }
注意:此时仍需保留FLAG_SHOW_WHEN_LOCKED和FLAG_KEEP_SCREEN_ON,确保应用能在锁屏层上方正常显示。
三、额外注意事项
- 当应用切换到后台(最小化)时,系统会自动移除这些Flag,此时回到应用需要解锁屏幕,这和谷歌地图的行为完全一致。
- 部分定制化ROM可能对锁屏权限有额外限制,建议测试时覆盖主流品牌设备。
- 如果是后台服务触发的导航界面,还要确保Activity的启动模式和唤醒逻辑正确,避免被系统拦截。
内容的提问来源于stack exchange,提问作者Ginso




