Activityと同じライフサイクルを持たせたクラスを「ライフサイクル対応コンポーネント」と呼びます。
このコンポーネントを作成する際に、以前はアノテーション@OnLifecycleEventを付ける記述を行っていました。
現在(androidx.lifecycle:lifecycle-*:2.4.0以降)は、@OnLifecycleEventが非推奨となり、DefaultLifecycleObserverを使った記述が推奨になっています。
DefaultLifecycleObserverを使用したコンポーネントの作成方法をまとめます。
※ライフサイクル対応コンポーネントの詳細は「Lifecycleでライフサイクル対応コンポーネント作成」を参照
※androidx.lifecycle:lifecycle-*:2.4.0の詳細は「バージョン2.4」を参照
※環境:Android Studio Meerkat | 2024.3.1 Patch 1
Kotlin 2.0.0
androidx.lifecycle:lifecycle-*:2.6.2
コンポーネント作成
ライフサイクル対応コンポーネントは、DefaultLifecycleObserverインターフェースを実装します。
アノテーション@OnLifecycleEventが不要な分、記述は簡素になります。
class SampleComponent : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
// Createで行う処理
Log.i(TAG, "onCreate !")
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
// Startで行う処理
Log.i(TAG, "onStart !")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
// Resumeで行う処理
Log.i(TAG, "onResume !")
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
// Pauseで行う処理
Log.i(TAG, "onPause !")
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
// Stopで行う処理
Log.i(TAG, "onStop !")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
// Destroyで行う処理
Log.i(TAG, "onDestroy !")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(SampleComponent())
...
}
class SampleComponent : LifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
// Createで行う処理
Log.i(TAG, "onCreate State=${owner.lifecycle.currentState} !")
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
// Startで行う処理
Log.i(TAG, "onStart State=${owner.lifecycle.currentState} !")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
// Resumeで行う処理
Log.i(TAG, "onResume State=${owner.lifecycle.currentState} !")
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
// Pauseで行う処理
Log.i(TAG, "onPause State=${owner.lifecycle.currentState} !")
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
// Stopで行う処理
Log.i(TAG, "onStop State=${owner.lifecycle.currentState} !")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
// Destroyで行う処理
Log.i(TAG, "onDestroy State=${owner.lifecycle.currentState} !")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(SampleComponent())
...
}
ちなみに、Activityのクラスまわり(継承されるクラス群)は、Java⇒Kotlinへの置き換え行われています。
それに伴い、ライフサイクル対応コンポーネントへ「イベントの転送処理」を行う部分は、大幅に書き換わっています。
イベントの受信(LifecycleEventObserver)
LifecycleEventObserverを用いると、各々のイベントを受信できます。
class SampleEvent : LifecycleEventObserver {
override fun onStateChanged(
source: LifecycleOwner,
event: Lifecycle.Event
) {
Log.i(TAG, "Event = ${event}")
Log.i(TAG, "State = ${source.lifecycle.currentState}")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(SampleEvent())
...
}
イベントON_ANYを受信している事と等価です。
I Event = ON_CREATE I State = CREATED I Event = ON_START I State = STARTED I Event = ON_RESUME I State = RESUMED I Event = ON_PAUSE I State = STARTED I Event = ON_STOP I State = CREATED I Event = ON_DESTROY I State = DESTROYED
ライフサイクルのEventsとStates
Lifecycleはライブサイクルの状態をEventとState列挙型で管理しています。
最新のライブラリ(androidx.lifecycle:lifecycle-*:2.4.0以降)も、この仕様は変わりません。
下図は状態の変化とタイミングを示しています。

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(TAG, "onCreate State=${lifecycle.currentState} !")
...
}
override fun onStart() {
super.onStart()
Log.i(TAG, "onStart State=${lifecycle.currentState} !")
}
override fun onResume() {
super.onResume()
Log.i(TAG, "onResume State=${lifecycle.currentState} !")
}
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause State=${lifecycle.currentState} !")
}
override fun onStop() {
super.onStop()
Log.i(TAG, "onStop State=${lifecycle.currentState} !")
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "onDestroy State=${lifecycle.currentState} !")
}
}
MainActivity I onCreate State=INITIALIZED ! SampleComponent I onCreate State=CREATED ! MainActivity I onStart State=CREATED ! SampleComponent I onStart State=STARTED ! MainActivity I onResume State=STARTED ! SampleComponent I onResume State=RESUMED ! SampleComponent I onPause State=STARTED ! MainActivity I onPause State=STARTED ! SampleComponent I onStop State=CREATED ! MainActivity I onStop State=CREATED ! SampleComponent I onDestroy State=DESTROYED ! MainActivity I onDestroy State=DESTROYED !
関連記事:
