Androidアーキテクチャコンポーネントの実戦——ライフサイクル

注: この記事に関連するコードを参照してください:プロジェクトのソース コード

ライフサイクルは Google によって開始されたアーキテクチャ コンポーネントであり、コンポーネントのライフ サイクルを認識するために使用され、非コンポーネント オブジェクトにライフ サイクルを認識する機能を与えます。

ライフサイクル コンポーネントは、アクティビティやフラグメントなどの別のコンポーネントのライフ サイクル状態の変化に応答するために使用されます。これにより、非ライフ サイクル コンポーネントをアクティビティ、フラグメント、またはサービスのライフ サイクルに関連付けて、対応する処理を実行できます。さまざまなライフサイクルでの操作。その他の手順については、Google の公式 Web サイトのドキュメント「ライフサイクル」を参照してください。

以前、MVP デザイン パターンを使用した記事Kotlin+MVP+AndroidX を使用して Android プロジェクト フレームワークを構築する」を書きましたが、Lifecycle を使用する前に、アクティビティに対応するためにプレゼンターに多数のメソッドを追加したことがわかります。ライフサイクルは次のとおりです。

ベースプレゼンター:

interface BasePresenter {

    fun onCreate()

    fun onStart()

    fun onStop()

    fun onDestory()
}

次に、MainPresenter を具体的に実装します。

class MainPresenter(private val mViewBinder: MainViewBinder?) : BasePresenter {

    override fun onCreate() {}

    override fun onStart() {}

    override fun onStop() {}

    override fun onDestory() {}
}

アクティビティ/フラグメントで呼び出される:

class MainActivity : BaseActivity(), MainViewBinder {

    private val mMainPresenter = MainPresenter(this)

    override val contentView: Int
        get() = R.layout.activity_main

    override fun initView() {
    }

    override fun initData() {
    }

    override fun onStart() {
        super.onStart()
        mMainPresenter?.onStart()
    }

    override fun onStop() {
        super.onStop()
        mMainPresenter?.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
        mMainPresenter?.onDestory()
    }
}

各ライフサイクル メソッドでは、メソッドの関連付けを再度記述する必要がありますが、これはまったくエレガントではないため、使用後にライフサイクルが表示されます。

interface BasePresenter : LifecycleObserver {
    //关联onCreate()
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate(owner: LifecycleOwner)

    //关联onStart()
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStart(owner: LifecycleOwner)

    //关联onStop()
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStop(owner: LifecycleOwner)

    //关联onDestroy()
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy(owner: LifecycleOwner)
}
class MainPresenter(private val mViewBinder: MainViewBinder?) : BasePresenter{

    override fun onCreate(owner: LifecycleOwner) {
        LogUtil.i("onCreate()")
    }

    override fun onStart(owner: LifecycleOwner) {
        LogUtil.i("onStart()")
    }

    override fun onStop(owner: LifecycleOwner) {
        LogUtil.i("onStop()")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        LogUtil.i("onDestroy()")
    }
}
class MainActivity : BaseActivity(), MainViewBinder {
    private val mMainPresenter = MainPresenter(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //lifecycle(getLifecycle())在AppCompatActivity已经定义了,直接使用
        lifecycle.addObserver(mMainPresenter)//关联起来
    }
}

このようにして、Presenter をアクティビティのライフサイクルに関連付けることができます。

使用する手順について説明します。

1. 依存関係を導入します。

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'

プロジェクトで androidx ファミリ バケットを使用しない場合は、以下を個別に引用することもできます。

implementation "android.arch.lifecycle:common-java8:1.1.0"

2. 関連するオブジェクトは LifecycleObserver インターフェイスを実装する必要があります

class MainPresenter() : LifecycleObserver{}

次の 2 つの方法があります。

  • DefaultLifecycleObserver インターフェースを実装し、内部のライフサイクル メソッドを書き換えます。androidx にはデフォルトでこれがないため、common-java8 バージョンを導入する必要があります。
  • LifecycleObserver インターフェースを実装し、アノテーションを通じてライフサイクルの変更を受け取ります。

プロジェクトのソース コードには 2 つの方法を記述しました。自分で確認してください。

3. 対応する @OnLifecycleEvent アノテーションをオブジェクトのメソッドに追加します。

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
    LogUtil.i("onCreate()")
}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
    LogUtil.i("onStart()")
}

4. アクティビティ/フラグメントを呼び出します。

 lifecycle.addObserver(mMainPresenter)//关联起来

MainActivity が開始されると、ログは次のようになります。

2019-11-28 10:18:58.293 16238-16238/com.king.frame I/king: onCreate()
2019-11-28 10:18:58.298 16238-16238/com.king.frame I/king: onStart()

破壊するとき:

2019-11-28 10:19:08.092 16238-16238/com.king.frame I/king: onStop()
2019-11-28 10:19:08.094 16238-16238/com.king.frame I/king: onDestroy()

それはとても簡単です。

おすすめ

転載: blog.csdn.net/gs12software/article/details/103288649