Androidライフサイクル管理のLifeCycles

5038 ワード

前の2つのブログでは、DataBindingの使用について説明しました.このブログで私たちは新しい勉強を始めました.この記事ではLifeCyclesについて説明します.
従来のライフサイクル管理の欠陥
ActivityやFragmentのように、ライフサイクルがあることはよく知られています.ライフサイクルは私たちにとっても重要です.しかし、処理がうまくいかないとメモリが漏れる可能性があります.
従来のライフサイクル管理では、異なるライフサイクルのコールバックで対応するアクションの呼び出しが行われています.例えばプレーヤー関連クラスの呼び出しを行う場合.接続操作はonStart()ライフサイクルで行います.しかしonStop()メソッドでブレーク操作を行うのを忘れてしまいました.この場合、一部のオブジェクトが解放されないとメモリが漏洩します.
ではLifeCyclesはどのように管理されているのでしょうか.LifeCyclesは、クラスの作成時に指定した関数がどのライフサイクルで実行されるかを注釈で説明し、ライフサイクルを持つクラスのライフサイクルを観察します.クラスの呼び出し者として、そんなに多くのライフサイクルに関連するものを管理する必要はありません.不注意でメモリが漏れることはありません.
LifeCycleObserverとLifeCycleOwner
LifeCyclerObserverは、ライフサイクルセンシングを有するクラスを実装するために必要なインタフェースであり、このインタフェースには何の方法もありません.このクラスでは,LifeCycleOwnerのどのライフサイクルで関数が実行されるかを注釈により示した.
LifeCycleOwnerもインタフェースで、このインタフェースはgetLifeCycleの1つの方法しかありません.実装クラスがライフサイクルを持つクラスであることを示す.バージョン26.01以降のsupportライブラリのActivity、FragmentではLifeCycleOwnerインタフェースが実装されています.ここまで言うと、support LibraryはAndroid P以降、新しい特性の追加を行わないと言わざるを得ません.代わりにandroidライブラリ、Googleが発売したもう一つのAndroid互換ライブラリです.
次に、LifeCycleObserverとLifeCycleOwnerのインタフェースクラスを定義しましょう.
LifecycleOwnerの実装
class MyLifeCycleOwner: LifecycleOwner {

    private lateinit var lifecycleRegistry: LifecycleRegistry

    fun onCreate(){
        lifecycleRegistry = LifecycleRegistry(this)
        lifecycleRegistry.markState(Lifecycle.State.CREATED)
    }

    fun onStart(){
        lifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    fun onResume(){
        lifecycleRegistry.markState(Lifecycle.State.RESUMED)
    }

    fun onPause(){
        lifecycleRegistry.markState(Lifecycle.State.RESUMED)
    }

    fun onStop(){
        lifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    fun onDestroy(){
        lifecycleRegistry.markState(Lifecycle.State.CREATED)
    }
    
    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
}

ここで私たちのクラスでライフサイクルを管理するために使用されるクラスはLifecycleRegistryクラスです.このクラスはLifeCycleのサブクラスであるため,getLifeCycleメソッドでLifeCycleクラスを返すことができる.その後、他の方法は、異なるActivityの異なるライフサイクルで状態のタグを行うために簡単に使用される.
LifecycleObserverインタフェースの実装
class MyObserver(var lifeCycle: Lifecycle) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        Log.e("MyObserver", "resume")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun disconnectListener() {
        Log.e("MyObserver", "pause")
    }

    fun getState(){
        if (lifeCycle.currentState.isAtLeast(Lifecycle.State.RESUMED)){
            Log.e("MyObserver", "isAtLeastResumed")
        }
    }
}

このクラスの構造関数がLifeCycleクラスに伝達されていることがわかります.これが私たちの上のLifeCycleOwner実装クラスのgetLifeCycleが返すものです.
私たちはgetStateメソッドでLifeCycleクラスを使用する必要があるので、ここで伝えます.LifeCycleクラスを使用する必要がなければ、転送しなくてもいいです.
その後、他の方法では@OnLifecucleEvent注記が使用され、注記値はどのライフサイクルの変化中に呼び出されますか.例えばLifecycle.Event.ON_RESUMEとは、CREATED状態からRESUME状態への呼び出しである.
MainActivityで呼び出す
class MainActivity : AppCompatActivity() {

    private lateinit var observer: MyObserver
    private lateinit var myLifeCycleOwner: MyLifeCycleOwner

    override fun onCreate(savedInstanceState: Bundle?) {
        myLifeCycleOwner = MyLifeCycleOwner()
        myLifeCycleOwner.onCreate()
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView(this,
                R.layout.activity_main)

        observer = MyObserver(myLifeCycleOwner.lifecycle)
        myLifeCycleOwner.lifecycle.addObserver(observer)

    }
    
    override fun onStart() {
        myLifeCycleOwner.onStart()
        super.onStart()
    }

    override fun onResume() {
        myLifeCycleOwner.onResume()
        super.onResume()
        observer.getSate()
    }

    override fun onPause() {
        myLifeCycleOwner.onPause()
        super.onPause()
    }

    override fun onStop() {
        myLifeCycleOwner.onStop()
        super.onStop()
    }

    override fun onDestroy() {
        myLifeCycleOwner.onDestroy()
        super.onDestroy()
    }
}

ここでは、ActivityのライフサイクルごとにMyLifecycleOwnerを与えています.
LifecycleOwnerとLifecycleObserverをカスタマイズする場合について学びました.しかし、通常はLifecycleOwnerを自分で実現する必要はありません.互換ライブラリのActivityとFragmentはLifecycleOwnerインタフェースを実現しているからです.私たちはLifecycleObserverを自分で実現すればいいだけです.下のようです.
class MainActivity : AppCompatActivity() {

    private lateinit var observer: MyObserver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView(this,
                R.layout.activity_main)

        observer = MyObserver(lifecycle)
        lifecycle.addObserver(observer)
    }
}

これにより、ActivityやFragmentのライフサイクルによって異なるメソッドを呼び出すことができます.
まとめ
このブログでは主にLifecycleOwnerとLifecycleObserverの2つのクラスで使用されています.特にLifecycleObserverの使用は、ライフサイクル管理を容易にします.
リファレンス
公式ドキュメント