ライフサイクル対応コンポーネント作成(DefaultLifecycleObserverを使用)

投稿日:  更新日:

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が不要な分、記述は簡素になります。

lifecycle-*≧2.4.0(現在)lifecycle-*<2.4.0(以前)
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以降)も、この仕様は変わりません。

下図は状態の変化とタイミングを示しています。

ライフサイクルのEventsとStates

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 !
スポンサーリンク

関連記事:

Androidアーキテクチャコンポーネント(AAC)は「堅牢でテストとメンテナンスが簡単なアプリの設計を支援する」とドキュメントで説明されています。 有効そうだけど、実態がよくわからないので、いろいろ調べて理解した内容をまとめました。 ...
Androidアーキテクチャコンポーネント(AAC)は「堅牢でテストとメンテナンスが簡単なアプリの設計を支援する」とドキュメントで説明されています。 その中で紹介されているコンポーネントの1つが「Lifecycle」です。 Lifecycleについて、まとめました。 【注意】 androidx.lifecycle:lifecycle-*:2.4.0以降は、@OnLifecycleEventが非推奨となり、DefaultLifecycleObserverを使った記述が推奨になっています。 ※詳細は「ライフサイクル対応コンポーネント作成(DefaultLifecycleObserverを使用)」を参照 ...
Androidアーキテクチャコンポーネント(AAC)は「堅牢でテストとメンテナンスが簡単なアプリの設計を支援する」とドキュメントで説明されています。 その中で紹介されているコンポーネントの1つが「LiveData」です。 LiveDataについて、まとめました。 ...
Androidアーキテクチャコンポーネント(AAC)は「堅牢でテストとメンテナンスが簡単なアプリの設計を支援する」とドキュメントで説明されています。 その中で紹介されているコンポーネントの1つが「ViewModel」です。 ViewModelについて、まとめました。 ...
Androidの開発スピードが速過ぎます。個人で習得を進めている私には、追い付いて行けません。 これが会社などであれば、グループ内のメンバーで分担して習得し、後に共有、などといった対応が可能でしょう。組織の強みですね! 先日も、久しぶりにAndroid Studioで新規プロジェクトを作成したら、Jetpack Composeのプロジェクトになってました。「はて?、これはどうすれば良いのだ?」と、頭の中は疑問符だらけで、プログラミングが先へ進めませんでした。 Jetpackの存在は知りながら、“使わなくてもアプリは作れる”と、学習は後回していたからです。 プロジェクトのひな型にJetpack Composeが採用されたならば、今後はJetpackの利用が開発の主軸になっていくのでしょう。 遅れ馳せならが、Jetpackの重要性を知った次第です。 ここで本腰をいれて習得しないと、さらに後方へ置いて行かれそうです。 という訳で、Jetpackの学習を始めました。 今回はJetpackそのものについてまとめます。 ※環境:Android Studio Flamingo | 2022.2.1 ...
View BindingはViewシステムを用いている場合に、プログラムから子Viewの参照を容易にする仕組みです。 Googleは「利点がある」と述べています。しかし、私は利点に感じないので、積極的な利用をしていません。 今まで、単なるオプションと考えていたのですが、最近は一般的になりつつあり、世に出回っているサンプルで頻繁に見かけるようになりました。 ですので、ここに備忘録として、まとめます。 ※環境:Android Studio Ladybug | 2024.2.1     Kotlin 1.9.24      (Viewシステムのプロジェクトは1.9.24が選ばれる)      (Composeのプロジェクトは2.0.0が選ばれる) ...
Data BindingはViewシステムを用いている場合に、Viewの表示と状態(データ)を結合する仕組みです。 結合とは「状態の変化に連動して、表示を更新する」ことです。 Googleは「利点がある」と述べています。しかし、私は利点に感じないので、積極的な利用をしていません。 Googleが提供するAndroidアプリのサンプルで頻繁に登場し、よく見かけます。 ですので、ここに備忘録として、まとめます。 ※環境:Android Studio Ladybug Feature Drop | 2024.2.2     Kotlin 2.0.0      (Viewシステムのプロジェクトは1.9.24が選ばれる)      (Composeのプロジェクトは2.0.0が選ばれる) ...
スポンサーリンク