[Android] LifecycleObserverでライフサイクルを監視する

Android Architecture Componentsに含まれているLifecycleObserverを使うことによって、Activity / FragmentのライフサイクルをActivity / Fragmentの外部で監視することができるようになります。Activity / Fragmentの役割とは関係のないロジック部分の実装を、Activity / Fragmentの外部へと容易に移動することができます。

Android Studio 3.2.1では、新規プロジェクトを作成した際、特に何もしなくてもLifecycleObserverを使うことができました。LifecycleObserverの使い方を以下に示します。

class MainActivity : AppCompatActivity() {

    private val myLifecycleObserver = MyLifecycleObserver()

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

        lifecycle.addObserver(myLifecycleObserver)
    }

    override fun onDestroy() {
        super.onDestroy()

        lifecycle.removeObserver(myLifecycleObserver)
    }
}

onCreateなどで、Observerを追加します。今回はMyLifecycleObserverというクラスでライフサイクルの監視を行いたいので、MyLifecycleObserverのインスタンスをonCreateでlifecycleに追加しています。lifecycleへObserverを追加するには、addObserverというメソッドを使います。

また、onDestroyなどで、Observerをlifecycleから削除します。こちらには、removeObserverというメソッドを使います。

ライフサイクルを監視するためのMyLifecycleObserverの実装を以下に示します。こちらではインターフェースLifecycleObserverをimplementしていますが、必ず実装しなければならないメソッドはありません。@OnLifecycleEventというアノテーションで、監視するライフサイクルを指定します。メソッド名は何でもいいようですが、わかりやすくライフサイクルイベントと同じ名前を付けておきました。

class MyLifecycleObserver: LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate() {
        Timber.i("onCreate")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStart() {
        Timber.i("onStart")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun onResume() {
        Timber.i("onResume")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        Timber.i("onPause")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStop() {
        Timber.i("onStop")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        Timber.i("onDestroy")
    }
}

これだけで、AndroidのライフサイクルをActivity / Fragmentの外部で監視できるようになります。

LifecycleObserverを使ったサンプルプロジェクトをGitHubに公開しました。