Jetpack Compose-保持屏幕常亮

前言

有些页面(播放视频、导航、点餐/收银、计时器、阅读器等)希望在页面停留期间不自动息屏

Android 上最常见的做法是给 Window 加上 FLAG_KEEP_SCREEN_ON

如果只想在某个 Compose 页面生效,可以在进入页面时开启、离开页面时关闭。

Compose 中控制(推荐)

优点是作用范围小、退出页面会自动恢复;并且不需要强转 Activity(避免在 Dialog/Preview/非 Activity Context 下崩溃)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalView

@Composable
fun KeepScreenOn(enabled: Boolean = true) {
val view = LocalView.current
DisposableEffect(enabled) {
val previous = view.keepScreenOn
view.keepScreenOn = enabled
onDispose {
view.keepScreenOn = previous
}
}
}

使用(放在需要常亮的页面/布局里即可):

1
KeepScreenOn()

如果你只想在某个条件下生效:

1
KeepScreenOn(enabled = isPlaying)

Activity 中设置(全局)

如果你的需求是“只要在这个 Activity 里就别息屏”,直接对 window 设置 flag 更合适。通常建议在 onResume/onPause 成对设置/清理(比 onCreate/onDestroy 更贴合可见性生命周期)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
MyApp()
}
}

override fun onResume() {
super.onResume()
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}

override fun onPause() {
super.onPause()
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}

主要生效点就是这行:

1
2
3
import android.view.WindowManager

window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

不要这样写

1
2
3
4
window.setFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
)

清除常亮

1
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

其中你文中提到的:

enableEdgeToEdge() 就是 “一键开启透明系统栏 + 全屏布局” 的快捷方式,让你接下来只用关心 WindowInsets 的 padding,而不用再写繁琐的 Window 配置代码。