navigation component の lifecycle
navigation componentを使っていて、挙動であれっ?と思うことがあったため、簡単な画面遷移アプリを作ってlifecycleを試してみました。
内容としては、ボタンを押すとMainFragment
→SubFragment
にnavigationされるというものです。
以下、その時のログ(testは、MainFragment
, test2はSubFragment
に対応)
D/onAttach: test
D/onCreate: test
D/onCreateView: test
D/onViewCreated: test
D/onStart: test
D/onResume: test
//ボタンを押す
D/onPause: test
D/onStop: test
D/onAttach: test2
D/onCreate: test2
D/onCreateView: test2
D/onStart: test2
D/onResume: test2
D/onDestroyView: test
//戻る
D/onPause: test2
D/onStop: test2
D/onCreateView: test
D/onViewCreated: test
D/onStart: test
D/onResume: test
D/onDestroyView: test2
D/onDetach: test2
注意点としては、MainFragment
のonDestroyView
が呼ばれるのがSubFragment
のonResume
の後という点ですね。
あと画面戻るを押したときはSubFragment
のonDestroyView
が呼ばれるのがMainFragment
のonResume
の後になります。
私は、MainFragment
とSubFragment
のonViewCreated
中に同じFlow
を処理する記述をしていたのですが、なぜか裏で動いている挙動に困っていたのですが、
MainFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
something.collect {
// TODO
}
}
SubFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
something.collect {
// TODO
}
}
↑画面遷移時にTODOが両方のFragmentで発火する
MainFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
lifecycle.whenStarted{
something.collect {
// TODO
}
}
}
SubFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
lifecycle.whenStarted{
something.collect {
// TODO
}
}
}
lifecycle.when〇〇等を使って、ちゃんと発火の制限をしましょう。