You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:24:03