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 !
関連記事: