应用层的三种屏幕常亮实现介绍
Android用FLAG_KEEP_SCREEN_ON(API)或WakeLock(底层);鸿蒙/窗口系统用setKeepScreenOn;Web用WakeLock API。优先高层API,注意及时释放以省电。鸿蒙需窗口对象,Android/iOS绑定生命周期,Web检测兼容性。
一、屏幕常亮功能简介
背景:在测试鸿蒙过程中发现鸿蒙在播放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')(“浏览器导航.唤醒锁.请求(屏幕唤醒锁)”)让网页在浏览器中保持屏幕常亮。
应用场景
- 视频播放应用:播放时常亮
- 导航类应用:导航过程中常亮
- 直播、会议软件:观看/参与时常亮
- 阅读器:阅读电子书时常亮
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唤醒)。
应用场景
- 下载工具:下载过程中保持CPU和屏幕唤醒,防止任务中断
- 长时间后台任务:如数据同步、实时监控
- IoT设备管理应用:需要长时间保持设备唤醒
3.窗口属性标记
原理:通过设置窗口对象的属性,告知系统在当前窗口活动时保持屏幕亮起。这种机制适用于多窗口环境或桌面系统,能灵活控制某个窗口的常亮状态。
- 鸿蒙:
const windowClass = this.context.windowStage.getMainWindowSync(); windowClass.setKeepScreenOn(true);
先获取主窗口对象,然后调用窗口的 setKeepScreenOn 方法。
- Electron(桌面应用):
mainWindow.setAlwaysOnTop(true)(虽然是置顶,但部分平台也有常亮/唤醒相关属性)
应用场景
- 多窗口应用:只让某个窗口常亮,比如视频播放窗口
- 桌面软件:如远程桌面、监控软件,主显示窗口常亮
- 会议/展示系统:主展示窗口常亮,其他窗口可休眠
三、鸿蒙demo应用层实现常亮
主要原理:获取窗口对象,然后调用平台的 setKeepScreenOn 方法,完成屏幕常亮功能。所属上述所提到的窗口属性标记。
- **界面交互设计:**提供“开启/关闭屏幕常亮”按钮,用户可一键切换。按钮文案根据状态动态切换。
// 屏幕常亮按钮
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;
}
- 上下文与窗口对象获取:代码示例:
this.context.windowStage.getMainWindowSync()获取主窗口对象。错误处理:无上下文或窗口对象时给出友好提示。 - 设置屏幕常亮状态:
windowClass.setKeepScreenOn(enable),异步Promise处理,成功/失败均有反馈。状态同步:this.isKeepScreenOn = enable。用户提示:prompt.showToast({ message: … }) - 业务场景自动设置:如视频播放期间自动开启,播放结束后关闭,提升体验。代码封装:
setKeepScreenOnForPlayback(enable) - 异常与边界处理:捕获异常并反馈日志与错误信息,保证稳定性。
四、各平台使用总结
- 移动端(Android/iOS):优先用平台官方的API,简单场景优先页面/应用级常亮,复杂场景再用唤醒锁。
- Web前端:用 Wake Lock(唤醒锁)API,需兼容性检测。
- 鸿蒙/桌面/多窗口系统:用窗口级常亮API,灵活控制,适合多窗口和分屏场景。、
- 所有场景:注意节能,及时释放常亮/唤醒锁,防止电池消耗异常。
更多推荐


所有评论(0)