uni.setKeepScreenOn 是 uni-app 中唯一跨平台可靠的屏幕常亮方案,需配置 Android WAKE_LOCK 权限、严格配对 onShow/onHide 调用,并与亮度、锁屏控制等无关。

uni.setKeepScreenOn 是唯一可靠方案
在 uni-app 中,禁止屏幕自动熄灭只有 uni.setKeepScreenOn 这个 API 是跨平台、原生支持且无需额外封装的。它不依赖 WebView 行为,也不受 H5 限制,直接调用系统 WakeLock 机制(Android)或 UIApplication.idleTimerDisabled(iOS)。plus.device.setWakelock 虽然也能用,但属于 HTML5+ 私有 API,HBuilderX 新版本已明确建议迁移到 uni.setKeepScreenOn,否则在某些 Android 12+ 厂商 ROM 上会静默失败。
必须配 Android 权限,否则真机无效
Android 平台下,uni.setKeepScreenOn({ keepScreenOn: true }) 在未声明权限时**完全无反应,也不报错**——这是最常踩的坑。必须做两件事:
- 在
manifest.json的「App原生端 → Android → 权限」中添加:{"name":"android.permission.WAKE_LOCK","description":"保持屏幕常亮权限"} - 或手动编辑
src/main/AndroidManifest.xml,插入:<uses-permission android:name="android.permission.WAKE_LOCK"/> - 改完后必须重新打包自定义基座或正式 APK,热更新和云打包均不生效
生命周期里开/关要严格配对
不能只在 onShow 开启,还必须在对应时机关闭,否则用户切到其他 App 后屏幕仍常亮,严重耗电。正确做法是:
- 在页面级
onShow中调用uni.setKeepScreenOn({ keepScreenOn: true }) - 在页面级
onHide中调用uni.setKeepScreenOn({ keepScreenOn: false }) - 如果页面支持“后台播放”(如音乐/视频),则不应在
onHide关闭,而应改在onUnload或用户显式退出播放时关闭 - App 级全局控制(如整个阅读类 App)可放在
App.vue的onShow/onHide,但需加判断:仅对特定页面路径生效,避免误锁整个 App
别和亮度、全屏、锁屏控制栏混淆
uni.setKeepScreenOn 只解决“不息屏”,和其他功能完全无关:
- 它不改变屏幕亮度——想提亮得单独调
uni.setScreenBrightness,且 Android 需额外WRITE_SETTINGS权限 - 它不维持锁屏后的媒体控制栏——那是前台服务 + MediaSession 的事,
uni.setKeepScreenOn对锁屏界面零影响 - 它不阻止系统进入休眠(CPU 降频/网络暂停),只是让屏幕保持点亮;后台保活需另配推送、定位或音频服务
- iOS 上部分机型在低电量模式下会强制忽略该调用,属系统策略,代码无法绕过


















