【Android】Jetpack Composeでwakelock対応(スリープさせない)をする【Tips】
個人的なメモも兼ねて
概要
Androidアプリにおいて、何らかの都合で画面をスリープ状態にさせないようにする場合は専用の実装が必要です。
Android公式の推奨方法はFLAG_KEEP_SCREEN_ON
をActivityから呼ぶ実装です。
// コードで呼ぶ例
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
ところで、Jetpack Compose対応する場合、ActivityからsetContent
を呼んで実装していきますが、Jetpack ComposeのComposable側からはActivityにアクセスできないように見えます。どのように実装すればいいのでしょうか。
結論
Stack Overflowで紹介されていました。
LocalContextを使うとcontextを取得できるため、ここからActivityを取得し、フラグを追加することができます。
@Composable
fun KeepScreenOn() {
val context = LocalContext.current
DisposableEffect(Unit) {
val window = context.findActivity()?.window
window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
println("FLAG_KEEP_SCREEN_ON")
onDispose {
window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
println("FLAG_KEEP_SCREEN_OFF")
}
}
}
fun Context.findActivity(): Activity? {
var context = this
while (context is ContextWrapper) {
if (context is Activity) return context
context = context.baseContext
}
return null
}
もうちょっと解説
既存のAndroidフレームワークとの連携については以下のページで解説されています。
CompositionLocal
を使用している一連のクラス群を使うことでAndroidフレームワークの値にアクセスできます。LocalContextでContextが取得できる他、LocalConfigurationでConfigration(端末のサイズなど)を得たり、LocalViewで現在のViewそのものを得ることもできます。覚えておくと今後役に立つでしょう。
参考
Author And Source
この問題について(【Android】Jetpack Composeでwakelock対応(スリープさせない)をする【Tips】), 我々は、より多くの情報をここで見つけました https://qiita.com/alpha2048/items/0a48cf588e3ca826393f著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .