一、屏幕常亮功能简介

背景:在测试鸿蒙过程中发现鸿蒙在播放10分钟后会熄屏,同时鸿蒙手机的系统设置休眠时长最长为10分钟。所以只能从应用层调用API实现屏幕常亮。
在这里插入图片描述

定义:屏幕常亮是指在应用运行期间,主动防止设备进入休眠或锁屏状态,确保屏幕持续点亮。
应用场景:视频播放、直播、导航、阅读、游戏等需要长时间屏幕展示的场景。
用户体验意义:避免因系统自动休眠导致操作中断,提高应用可用性。

二、三种技术实现原理介绍

1.系统API支持

原理:平台直接提供了用于控制屏幕常亮的接口(API),开发者在应用内调用这些API即可使屏幕在应用活动期间保持唤醒。这些API通常是最简单、最高层的能力,直接作用于当前应用或页面。

  • Android:Window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)(“窗口.添加标志(保持屏幕常亮)”)在Activity的窗口上设置该标志,屏幕在该页面不会自动熄灭。

  • iOS:UIApplication.shared.isIdleTimerDisabled = true(“当前应用实例.屏幕自动锁定禁用 = true”)设置后,应用在前台时屏幕不会自动锁屏。

  • Web:navigator.wakeLock.request('screen')(“浏览器导航.唤醒锁.请求(屏幕唤醒锁)”)让网页在浏览器中保持屏幕常亮。

应用场景

  1. 视频播放应用:播放时常亮
  2. 导航类应用:导航过程中常亮
  3. 直播、会议软件:观看/参与时常亮
  4. 阅读器:阅读电子书时常亮

2.唤醒锁机制

原理:通过向系统申请唤醒锁(WakeLock),可以在更底层控制设备的唤醒状态。唤醒锁分为不同类型,如仅保持屏幕唤醒、保持CPU运行等。开发者可以在需要时申请锁,任务完成后释放锁,以节省能耗。

  • Android:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);//通过 getSystemService 方法获取系统的电源管理服务(PowerManager)
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyTag"); //用 pm.newWakeLock(...) 方法创建一个唤醒锁(WakeLock)对象。
wakeLock.acquire(); //通过 acquire() 方法,正式申请唤醒锁。设备在唤醒锁持有期间,会保持屏幕和/或CPU不进入休眠状态(取决于锁类型)
// 任务完成后 wakeLock.release();
  • Web:
    Wake Lock API 也可以用于更细粒度的控制(如只保持CPU唤醒)。

应用场景

  1. 下载工具:下载过程中保持CPU和屏幕唤醒,防止任务中断
  2. 长时间后台任务:如数据同步、实时监控
  3. IoT设备管理应用:需要长时间保持设备唤醒

3.窗口属性标记

原理:通过设置窗口对象的属性,告知系统在当前窗口活动时保持屏幕亮起。这种机制适用于多窗口环境或桌面系统,能灵活控制某个窗口的常亮状态。

  1. 鸿蒙:
const windowClass = this.context.windowStage.getMainWindowSync(); windowClass.setKeepScreenOn(true); 

先获取主窗口对象,然后调用窗口的 setKeepScreenOn 方法。

  • Electron(桌面应用):mainWindow.setAlwaysOnTop(true)(虽然是置顶,但部分平台也有常亮/唤醒相关属性)

应用场景

  1. 多窗口应用:只让某个窗口常亮,比如视频播放窗口
  2. 桌面软件:如远程桌面、监控软件,主显示窗口常亮
  3. 会议/展示系统:主展示窗口常亮,其他窗口可休眠

三、鸿蒙demo应用层实现常亮

主要原理:获取窗口对象,然后调用平台的 setKeepScreenOn 方法,完成屏幕常亮功能。所属上述所提到的窗口属性标记。

  1. **界面交互设计:**提供“开启/关闭屏幕常亮”按钮,用户可一键切换。按钮文案根据状态动态切换。
// 屏幕常亮按钮
Button(this.isKeepScreenOn ? '关闭屏幕常亮' : '开启屏幕常亮')
.width('100%')
                .margin({ top: 20 })
                .onClick(() => {
                  if (!this.context) {
                    this.errorMessage = '无法获取上下文';
                    return;
                  }
                  try {
                    const windowClass = this.context.windowStage.getMainWindowSync();
                    if (!windowClass) {
                      this.errorMessage = '无法获取窗口';
                      return;
                    }
  1. 上下文与窗口对象获取:代码示例:this.context.windowStage.getMainWindowSync() 获取主窗口对象。错误处理:无上下文或窗口对象时给出友好提示。
  2. 设置屏幕常亮状态:windowClass.setKeepScreenOn(enable),异步Promise处理,成功/失败均有反馈。状态同步:this.isKeepScreenOn = enable。用户提示:prompt.showToast({ message: … })
  3. 业务场景自动设置:如视频播放期间自动开启,播放结束后关闭,提升体验。代码封装:setKeepScreenOnForPlayback(enable)
  4. 异常与边界处理:捕获异常并反馈日志与错误信息,保证稳定性。

四、各平台使用总结

  • 移动端(Android/iOS):优先用平台官方的API,简单场景优先页面/应用级常亮,复杂场景再用唤醒锁。
  • Web前端:用 Wake Lock(唤醒锁)API,需兼容性检测。
  • 鸿蒙/桌面/多窗口系统:用窗口级常亮API,灵活控制,适合多窗口和分屏场景。、
  • 所有场景:注意节能,及时释放常亮/唤醒锁,防止电池消耗异常。
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐