【Kotlin/Android】LifecycleObserverの使い方!ライフサイクルに処理を依存させる

【Kotlin/Android】LifecycleObserverの使い方!ライフサイクルに処理を依存させる

この記事からわかること

  • Android Studio/KotlinLifecycleObserver使い方
  • ライフサイクルに特定の処理依存させる方法
  • onCreate()onStart()onAttachonPause()onStop()onDestroy()違い処理

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

LifecycleObserver

公式リファレンス:LifecycleObserver

KotlinのLifecycleObserverLifecycleOwner(ActivityやFragmentなど)のライフサイクルの変化を観測し任意の処理を実行させることができるインターフェイスです。LifecycleObserverインターフェースを直接使用するのではなく継承したサブクラスであるDefaultLifecycleObserverまたはLifecycleEventObserverを継承したサブクラスを作成して使用します。

LifecycleObserver観測対象にできるライフサイクルonStartからonDestroyまでになります。

【Kotlin/Android Studio】Activityのライフサイクルの種類と役割

引用:公式リファレンス:The activity lifecycle

DefaultLifecycleObserver

  1. DefaultLifecycleObserverを継承したサブクラスを作成
  2. 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の中でlifecycleaddObserverメソッドを使用してクラスを渡します。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    lifecycle.addObserver(MyLifecycleObserver())
}

これで実装は完了であとはActivityのライフサイクルが変化するたびにMyLifecycleObserverの各メソッドの処理が呼ばれるようになります。

Fragmentのライフサイクルを観測する

Fragmentのライフサイクルを観測するにはActivityの時と同じようにonCreateの中でlifecycleaddObserverメソッドを使用してクラスを渡します。

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することで処理を実装していましたが、LifecycleEventObserveronState 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")
        }
    }
}

ActivityFragmentへの適応方法は同じです。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index