You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现应用保持屏幕常亮并显示在锁屏之上?

实现类似谷歌地图的锁屏上方显示+屏幕常亮功能

刚好我之前研究过类似的需求,谷歌地图的这个功能其实是结合了几个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_LOCKEDFLAG_KEEP_SCREEN_ON,确保应用能在锁屏层上方正常显示。

三、额外注意事项

  • 当应用切换到后台(最小化)时,系统会自动移除这些Flag,此时回到应用需要解锁屏幕,这和谷歌地图的行为完全一致。
  • 部分定制化ROM可能对锁屏权限有额外限制,建议测试时覆盖主流品牌设备。
  • 如果是后台服务触发的导航界面,还要确保Activity的启动模式和唤醒逻辑正确,避免被系统拦截。

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

火山引擎 最新活动