【Kotlin/Android】LifecycleObserverの使い方!ライフサイクルに処理を依存させる
この記事からわかること
- Android Studio/KotlinのLifecycleObserverの使い方
- ライフサイクルに特定の処理を依存させる方法
- onCreate()、onStart()、onAttach、onPause()、onStop()、onDestroy()の違いと処理
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
LifecycleObserver
KotlinのLifecycleObserver
はLifecycleOwner(ActivityやFragmentなど)のライフサイクルの変化を観測し任意の処理を実行させることができるインターフェイスです。LifecycleObserver
インターフェースを直接使用するのではなく継承したサブクラスであるDefaultLifecycleObserver
またはLifecycleEventObserver
を継承したサブクラスを作成して使用します。
LifecycleObserver
で観測対象にできるライフサイクルはonStart
からonDestroy
までになります。
引用:公式リファレンス:The activity lifecycle
DefaultLifecycleObserver
- DefaultLifecycleObserverを継承したサブクラスを作成
- lifecycle.addObserverで追加する
ライフサイクルの変化を検知して任意の処理を実行するにはDefaultLifecycleObserver
を継承してサブクラスを定義します。継承すると各ライフサイクルメソッドをoverrideできるのでその中に任意の処理を記述します。
class MyLifecycleObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
Log.d("Lifecycle" , "onStart")
}
override fun onResume(owner: LifecycleOwner) {
Log.d("Lifecycle" , "onResume")
}
override fun onPause(owner: LifecycleOwner) {
Log.d("Lifecycle" , "onPause")
}
override fun onStop(owner: LifecycleOwner) {
Log.d("Lifecycle" , "onStop")
}
override fun onDestroy(owner: LifecycleOwner) {
Log.d("Lifecycle" , "onDestroy")
}
}
Activityのライフサイクルを観測する
Activity
のライフサイクルを観測するにはonCreate
の中でlifecycle
にaddObserver
メソッドを使用してクラスを渡します。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(MyLifecycleObserver())
}
これで実装は完了であとはActivity
のライフサイクルが変化するたびにMyLifecycleObserver
の各メソッドの処理が呼ばれるようになります。
Fragmentのライフサイクルを観測する
Fragment
のライフサイクルを観測するにはActivity
の時と同じようにonCreate
の中でlifecycle
にaddObserver
メソッドを使用してクラスを渡します。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(MyLifecycleObserver())
}
onViewCreated
の中でviewLifecycleOwner.lifecycle.addObserver
で追加しても正常に動作しました。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(MyLifecycleObserver())
}
LifecycleEventObserver
LifecycleEventObserver
でも同じようにライフサイクルイベントの変化を検知して任意の処理を実行することができます。DefaultLifecycleObserver
では各ライフサイクルメソッドと同名のメソッドをoverrideすることで処理を実装していましたが、LifecycleEventObserver
はonState Change
メソッド1つをoverrideしてその中でイベントを識別して処理を分岐します。
class MyLifecycleObserver : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_CREATE -> Log.d("Lifecycle", "onCreate")
Lifecycle.Event.ON_START -> Log.d("Lifecycle", "onStart")
Lifecycle.Event.ON_RESUME -> Log.d("Lifecycle", "onResume")
Lifecycle.Event.ON_PAUSE -> Log.d("Lifecycle", "onPause")
Lifecycle.Event.ON_STOP -> Log.d("Lifecycle", "onStop")
Lifecycle.Event.ON_DESTROY -> Log.d("Lifecycle", "onDestroy")
else -> Log.d("Lifecycle", "OTHER_EVENT")
}
}
}
Activity
やFragment
への適応方法は同じです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。