安卓架構組件實戰——Lifecycle

注:本文涉及代碼請看:項目源碼

Lifecycle是谷歌推出的一個架構組件,用於感知組件生命週期,並賦予了非組件對象感知生命週期的能力

Lifecycle組件用來響應另一個組件的生命週期狀態變化,例如Activity和Fragment,可以幫助非生命週期組件跟Activity、Fragment或Service的生命週期關聯在一起,從而在不同生命週期內執行相應操作。其他說明請參考谷歌官網文檔Lifecycle

在之前我寫了一篇《使用Kotlin+MVP+AndroidX搭建安卓項目框架》,裏面使用了MVP的設計模式,在沒有使用Lifecycle之前你可以看到在Presenter裏面我添加了一堆方法來對應Activity的生命週期,如下:

BasePresenter:

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() {}
}

在Activity/Fragment中調用:

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()
    }
}

在每個生命週期方法都需寫一遍方法關聯,一點都不優雅,於是Lifecycle就出現了,使用後:

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就可以和Activity的生命週期關聯起來了。

下面說說使用步驟:

1.引入依賴:

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

如果你項目不是用androidx全家桶,也可以單獨引用下面:

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

2.需要關聯的對象實現LifecycleObserver接口

class MainPresenter() : LifecycleObserver{}

有兩種方法:

  • 實現DefaultLifecycleObserver接口,然後重寫裏面生命週期方法;androidx默認沒有這個,需要引入common-java8版本
  • 實現LifecycleObserver接口,然後通過註解的方式來接收生命週期的變化;

在我的項目源碼裏面已經寫了兩種方式,可自行查看

3.在對象的方法內添加對應@OnLifecycleEvent註解:

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

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

4.在Activity/Fragment調用:

 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()

就是這麼簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章