徐中民 2025-11-29 10:45 采纳率: 98.6%
浏览 1
已采纳

Android13如何设置永不锁屏?

在Android 13系统中,如何通过设置或开发者选项实现屏幕永不锁屏?部分用户发现“睡眠”选项中可选的最长时间为30分钟,无法满足长时间展示界面的需求(如信息展示设备、POS机等场景)。尝试修改系统设置或使用ADB命令后仍可能被自动锁屏,尤其是在应用未运行或系统省电策略触发时。此外,某些厂商定制ROM会覆盖系统默认行为,导致设置不生效。如何通过Settings.System API、PowerManager WakeLock或Foreground Service结合屏幕常亮(FLAG_KEEP_SCREEN_ON)实现稳定不锁屏?需注意兼容性和电量消耗问题。
  • 写回答

1条回答 默认 最新

  • 程昱森 2025-11-29 11:28
    关注

    Android 13 屏幕永不锁屏的深度实现方案

    一、系统设置与开发者选项:基础配置尝试

    在 Android 13 中,用户可通过“显示”→“睡眠”设置屏幕自动关闭时间。然而,默认最大值通常为30分钟,无法满足信息展示设备或 POS 机等长时间运行场景的需求。

    • 进入「设置」→「显示」→「睡眠」,选择最长可选时间(如30分钟)。
    • 开启「开发者选项」:连续点击「关于手机」中「版本号」7次。
    • 在「开发者选项」中查找「不锁定屏幕(Stay awake)」,启用该功能可在充电时保持屏幕常亮。

    此方法仅在设备充电时有效,且部分厂商定制 ROM(如小米 MIUI、OPPO ColorOS)会限制或隐藏该选项,导致设置失效。

    二、ADB 命令强制修改系统设置

    通过 ADB 可绕过 UI 限制,直接写入系统设置值,尝试突破30分钟上限。

    adb shell settings put system screen_off_timeout 600000  # 设置为10分钟
    adb shell settings put system screen_off_timeout 0           # 部分系统支持0表示永不休眠
    Timeout Value (ms)说明是否生效(Android 13)
    3000030秒✅ 通用支持
    180000030分钟✅ 默认最大值
    0永不休眠⚠️ 部分设备被系统忽略

    即使设置为0,某些 OEM 厂商(如华为 EMUI)会在后台策略中强制恢复默认超时,导致锁屏仍会发生。

    三、应用层控制:FLAG_KEEP_SCREEN_ON 实现界面常亮

    在 Activity 中使用窗口标志可防止屏幕在当前界面关闭。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_main);
    }

    或在布局文件中添加:

    android:keepScreenOn="true"

    该方式轻量且无需权限,但仅在 Activity 存活期间有效,切换应用或进程被杀后失效。

    四、PowerManager WakeLock:底层唤醒锁机制

    WakeLock 提供更细粒度的电源控制,需声明权限:

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

    获取 WakeLock 示例代码:

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
        PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,
        "MyApp::ScreenOn");
    wakeLock.acquire(10*60*1000); // 持有10分钟

    注意:从 Android 13 开始,SCREEN_BRIGHT_WAKE_LOCK 已被弃用,推荐结合 FLAG_KEEP_SCREEN_ON 使用。

    五、Foreground Service + 保活机制:稳定防锁屏方案

    为应对省电策略和后台限制,需启动前台服务并持续持有唤醒状态。

    public class ScreenKeepAliveService extends Service {
        private PowerManager.WakeLock wakeLock;
    
        @Override
        public void onCreate() {
            super.onCreate();
            PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "KeepAlive::Lock");
            wakeLock.acquire();
    
            Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("屏幕常亮服务运行中")
                .setSmallIcon(R.drawable.ic_service)
                .build();
            startForeground(1, notification);
        }
    
        @Override
        public IBinder onBind(Intent intent) { return null; }
    }

    在 AndroidManifest.xml 中注册:

    <service android:name=".ScreenKeepAliveService" 
             android:foregroundServiceType="specialEffect" />

    六、厂商兼容性与系统策略对抗

    不同 OEM 对电源管理策略差异显著,常见问题包括:

    • 小米:需手动添加「自启动」和「电池不限制」
    • 华为:EMUI 会杀死长期运行服务
    • Vivo:后台高耗电应用自动清理

    解决方案:

    1. 引导用户手动设置白名单
    2. 使用 AccessibilityService 模拟用户操作防休眠
    3. 集成厂商 SDK(如小米 AutoStart API)

    七、电量优化与最佳实践建议

    持续唤醒屏幕将显著增加功耗,需权衡功能与续航。

    graph TD A[启动应用] --> B{是否需要常亮?} B -->|是| C[申请WAKE_LOCK权限] C --> D[启动Foreground Service] D --> E[设置FLAG_KEEP_SCREEN_ON] E --> F[检测用户交互] F -->|无操作超时| G[可选调暗亮度] F -->|持续展示| H[维持亮度] H --> I[监听系统锁屏广播]

    建议策略:

    • 非必要时不常亮,采用传感器检测是否有人观看
    • 降低屏幕亮度至40%-50%
    • 使用 Doze 模式豁免(REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月30日
  • 创建了问题 11月29日