@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
}
7条答案
按热度按时间w9apscun1#
您可以使用
LocalContext
来获取活动,它有一个窗口,您可以在其中应用所需的标志。在这种情况下,当你需要在视图的出现和消失上运行一些代码时,可以使用
DisposableEffect
:用法:当屏幕出现时,标志设置为开,当屏幕消失时,标志被清除。
正如@Louis CAD正确指出的,如果在许多视图中使用此“视图”,可能会出现问题:如果出现一个使用它的视图,然后消失先前也使用它的视图,它将重置该标志。
我还没有找到一种跟踪
flags
状态来更新视图的方法,我认为@Louis CAD solution可以,直到Compose有一些系统支持。ldioqlga2#
如果你在同一个组合中有多个用法,这个应该是安全的,不会受到任何干扰:
用法就这么简单:
js5cn81o3#
以一种更复杂的方式:
当视图从组合中消失时,它将被处理掉。用法很简单:
eagi6jfj4#
这就是我如何实现我的
在Composable函数中,我有一个按钮用于激活FLAG_KEEP_SCREEN_ON或清除FLAG_KEEP_SCREEN_ON
xqk2d5yq5#
下面的代码最适合我。
下面的代码在我切换它的存在(有条件地添加、删除、添加组件)时不起作用。
gv8xihay6#
把它放在你的活动主题中:
愚蠢,但它工作。
yv5phkfx7#
我使用了这个解决方案:
在所有你想阻止睡眠的可组合的乐趣中,把这个叫做乐趣