Jetpack Compose中有没有替代android:keepScreenOn保持屏幕常亮的方法?
Compose 无权限保持屏幕常亮实现方案
Compose 中存在不需要申请唤醒锁权限的保持屏幕常亮方案,实现逻辑与原生 XML 方案同源,仅前台生效无后台功耗风险。
核心原理
该方案底层复用 Android 平台的
FLAG_KEEP_SCREEN_ON逻辑,仅当你的 App 处于前台可见状态时生效,不会持有后台唤醒锁,因此完全不需要申请WAKE_LOCK权限。
封装通用工具函数
你可以封装一个可复用的 Composable 函数,自动在组件挂载/卸载时同步常亮状态:
@Composable fun KeepScreenOn(enabled: Boolean = true) { val currentView = LocalView.current SideEffect { currentView.keepScreenOn = enabled } }
适配你的动画场景
你需要仅在 alpha 动画运行期间保持屏幕常亮,只需要将工具函数的开关参数和动画运行状态绑定即可:
@Composable fun AlphaAnimatedImage(@DrawableRes imageRes: Int) { // 标记动画是否正在运行 var isAnimationRunning by remember { mutableStateOf(true) } // 你的alpha动画逻辑 val imageAlpha by animateFloatAsState( targetValue = 1f, animationSpec = tween(durationMillis = 3000), // 替换为你的动画时长 finishedListener = { // 动画结束后关闭常亮开关,恢复系统熄屏逻辑 isAnimationRunning = false } ) // 仅动画运行时保持屏幕常亮 KeepScreenOn(enabled = isAnimationRunning) Image( painter = painterResource(id = imageRes), contentDescription = null, modifier = Modifier.alpha(imageAlpha) ) }
其他使用场景
- 如果需要指定 Composable 全程可见时保持常亮,直接在对应组件内部调用
KeepScreenOn()即可 - 如果需要整个 Activity 全局保持常亮,直接在
setContent代码块中调用KeepScreenOn()即可,效果等价于原生window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
内容的提问来源于stack exchange,提问作者Bharadwaj Giridhar
相关产品推荐
相关产品推荐

