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

咨询Android应用实现类似谷歌地图的屏幕常亮功能的正确方案

解决Android 9屏幕常亮(忽略系统锁屏/超时)问题

你当前的代码只处理了锁屏状态下显示应用、唤醒屏幕的需求,但没有阻止系统的屏幕超时休眠机制,这就是屏幕仍会熄灭的原因。以下是针对Android 9设备的正确实现方案:

核心思路

要实现类似谷歌地图驾驶界面的常亮效果,需要同时处理两个点:

  1. 允许应用在锁屏状态下显示并唤醒屏幕(你的原有逻辑)
  2. 阻止系统因无操作触发屏幕超时熄灭(新增核心逻辑)

方案1:使用WindowManager标记(推荐)

这种方式无需手动管理唤醒锁,系统会自动在窗口不可见时释放资源,更安全高效。

步骤1:添加权限(可选,但建议声明)

在AndroidManifest.xml中添加WAKE_LOCK权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

步骤2:修改工具类代码

public class ActivityUtils {
    public static void enableKeepScreenOn(Activity activity) {
        // 处理锁屏唤醒逻辑(保留原有适配)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            activity.setShowWhenLocked(true);
            activity.setTurnScreenOn(true);
            KeyguardManager keyguardManager = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);
            keyguardManager.requestDismissKeyguard(activity, null);
        } else {
            // 兼容Android 8.1及以下版本(如果需要)
            Window window = activity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        }

        // 添加屏幕常亮核心标记
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    // 可选:不需要常亮时调用,移除标记
    public static void disableKeepScreenOn(Activity activity) {
        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

方案2:布局文件直接设置(更简单)

如果你的页面固定需要常亮,无需动态控制,可以直接在布局根节点添加android:keepScreenOn="true"属性:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">

    <!-- 页面布局内容 -->

</LinearLayout>

这种方式不需要任何代码,系统会自动维护屏幕常亮状态。

方案3:PowerManager唤醒锁(不推荐)

如果必须使用唤醒锁,需要严格管理生命周期,避免后台耗电:

public class ScreenWakeHelper {
    private PowerManager.WakeLock wakeLock;

    public void acquireWakeLock(Activity activity) {
        PowerManager powerManager = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "MyApp:ScreenWakeLock");
        wakeLock.acquire();

        // 同时保留你的锁屏处理逻辑
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            activity.setShowWhenLocked(true);
            activity.setTurnScreenOn(true);
            KeyguardManager keyguardManager = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);
            keyguardManager.requestDismissKeyguard(activity, null);
        }
    }

    public void releaseWakeLock() {
        if (wakeLock != null && wakeLock.isHeld()) {
            wakeLock.release();
            wakeLock = null;
        }
    }
}

使用时需要在Activity的onResume调用acquireWakeLock,onPause调用releaseWakeLock,防止应用后台时持续耗电。

关键说明

  • setShowWhenLocked和setTurnScreenOn仅控制锁屏状态下的应用可见性和唤醒屏幕,不影响系统的屏幕超时设置。
  • FLAG_KEEP_SCREEN_ON和android:keepScreenOn是官方推荐的屏幕常亮实现方式,无需手动管理资源,安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:35:19