首页 > 解决方案 > 是否有 Jetpack Compose 等效于 android:keepScreenOn 以保持屏幕活动?

问题描述

我有一个 Composable,它使用 Handler 来慢慢更新可组合内的图像的 alpha。但是,我看到屏幕在动画完成之前关闭。

在 XML 布局中,我们可以使用
android:keepScreenOn

window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

有没有办法在不使用唤醒锁定权限的情况下使用 compose 来做到这一点?

标签: androidandroid-jetpack-compose

解决方案


您可以LocalContext用来获取活动,它有一个窗口,您可以在上面应用所需的标志。

在这种情况下,当您需要在视图外观和消失上运行一些代码时,DisposableEffect可以使用:

@Composable
fun KeepScreenOn() {
    val context = LocalContext.current
    DisposableEffect(Unit) {
        val window = context.findActivity()?.window
        window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        onDispose {
            window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        }
    }
}

fun Context.findActivity(): Activity? {
    var context = this
    while (context is ContextWrapper) {
        if (context is Activity) return context
        context = context.baseContext
    }
    return null
}

用法:当屏幕出现时标志设置为打开,当消失时 - 它被清除。

@Composable
fun Screen() {
    KeepScreenOn()
}

正如@Louis CAD 正确指出的那样,如果在许多视图中使用此“视图”,您可能会遇到问题:如果出现一个使用它的视图,然后消失之前也使用它的视图,它将重置标志。

我还没有找到一种跟踪flags状态来更新视图的方法,我认为@Louis CAD解决方案是可以的,直到 Compose 有一些系统支持。


推荐阅读