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が不要な分、記述は簡素になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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 !" ) } } |
1 2 3 4 5 6 7 | override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) lifecycle.addObserver(SampleComponent()) ... } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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} !" ) } } |
1 2 3 4 5 6 7 | override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) lifecycle.addObserver(SampleComponent()) ... } |
ちなみに、Activityのクラスまわり(継承されるクラス群)は、Java⇒Kotlinへの置き換え行われています。
それに伴い、ライフサイクル対応コンポーネントへ「イベントの転送処理」を行う部分は、大幅に書き換わっています。
イベントの受信(LifecycleEventObserver)
LifecycleEventObserverを用いると、各々のイベントを受信できます。
1 2 3 4 5 6 7 8 9 10 | class SampleEvent : LifecycleEventObserver { override fun onStateChanged( source: LifecycleOwner, event: Lifecycle.Event ) { Log.i(TAG, "Event = ${event}" ) Log.i(TAG, "State = ${source.lifecycle.currentState}" ) } } |
1 2 3 4 5 6 7 | 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以降)も、この仕様は変わりません。
下図は状態の変化とタイミングを示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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 !
関連記事: