はじめに
Jetpack Composeを使用している状況でActivityのonNewIntent
やonActivityResult
でアプリの画面状態を更新する方法についての記事となります。
Jetpack Composeでは状態をMutableState
として保持し、remember
を使用することで再Compose後も状態を保持することができます。ただしこれら基本的に特定のComposable関数以下のスコープ内に制限されてしまい、onNewIntent
やonActivityResult
からどうやって更新すればいいんや~だったたのでコードを書いてみたという流れになります。
やったこと
方針としてはMutableState
をActivityのメンバとして保持し、その値をremember
でComposable関数に記憶させます。
1.Activityのメンバ変数にMutableState
で変数を持たせる。
ここで定義した値をonNewIntent
やonActivityResult
で更新し、それらを読みこむComposable関数を更新させる算段です。
class MainActivity : ComponentActivity() {
private val _message = mutableStateOf("initial message")
}
2.remember
で再Compose後も状態を保持する。
class MainActivity : ComponentActivity() {
// 他省略
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val message by remember { _message }
Text(text = message)
}
}
}
3.onNewIntent
でMutableState
を更新する。
class MainActivity : ComponentActivity() {
// 他省略
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
_message.value = "onNewIntent"
}
}
結果
感想
結構簡単にできました。
ちなみに自分はほかのアプリから明示的Intentで起動できるアプリを作成しており、onNewIntent
で値をもらってUIに反映するということがしたかったという背景があります。
またonNewIntent
を呼ぶにはActivityのLaunchModel
がsingleTask
などになるようにあらかじめ設定してあげましょう。
それと、今回の場合remember
は使わなくても良いのでしょうかね。remember
はComposition前後で値を保持し続けるための処理ですが、今回の場合値をメンバで保持しているため、rememberがなくても値は取得できていました。
以上です。