前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Android:FragmentのライフサイクルとLiveData、Flowの関係

内容

LiveDataやFlowを使って値の変更をwatchするようになり、Fragmentのライフサイクルに対してどのタイミングで発動するのかが気になったので調べてみた。

結果

イベント タイプ
onCreate Fragment
launchWhenCreated Flow
onCreateView Fragment
onViewCreated Fragment
onViewStateRestored Fragment
onStart Fragment
lifecycleOwner LiveData
launchWhenStarted Flow
viewLifecycleOwner LiveData
onResume Fragment
launchWhenResumed Flow
onStop Fragment
onSaveInstanceState Fragment
onDestroyView Fragment
  • onStart 以降に viewModelの値が変化した場合、コードの記述順に関わらず同じ順番でイベントが呼ばれている
  • viewLifecycleOwnerlaunchWhenStarted は後から値がセットされたか、最初から値があったかで順序が異なる。
    とはいえ同じ値を同時にwatchすることはないだろうから気にしなくても良さそう。

検証コード

コードは大体以下のような感じ。super()は省略。viewModel.hogeにはあらかじめ値がセットされているものと仮定する。

override fun onCreate() {
    viewModel.hoge.observe(this){
         Log.d(TAG, "lifecycleOwner")
    }

    lifecycleScope.launchWhenCreated {
        viewModel.hoge.asFlow().collectLatest {
            Log.d(TAG, "launchWhenCreated")
        }
    }

    lifecycleScope.launchWhenStarted {
        viewModel.hoge.asFlow().collectLatest {
            Log.d(TAG, "launchWhenStarted")
        }
    }

    lifecycleScope.launchWhenResumed {
        viewModel.hoge.asFlow().collectLatest {
            Log.d(TAG, "launchWhenResumed")
        }
    }

    Log.d(TAG, "onCreate")
}

override fun onCreateView() {
    viewModel.hoge.observe(viewLifecycleOwner) {
        Log.d(TAG, "viewLifecycleOwner")
    }
    Log.d(TAG, "onCreateView")
}

override fun onViewStateRestored() {
    Log.d(TAG, "onViewStateRestored")
}

override fun onStart() {
    Log.d(TAG, "onStart")
}

override fun onResume() {
    Log.d(TAG, "onResume")
}

override fun onStop() {
    Log.d(TAG, "onStop")
}

override fun onSaveInstanceState() {
    Log.d(TAG, "onSaveInstanceState")
}

override fun onDestroyView() {
    Log.d(TAG, "onDestroyView")
}

感想

概ね予想通り。 Fragmentのライフサイクルの後にFlowイベントが発火するのでその辺は意識しておいた方がいいかもしれない。 LiveDataとFlowに関してはViewModelの値が変更された場合のライフサイクルを含めた挙動などについても今後確認をしておきたい。