安卓架构组件实战——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()

就是这么简单。

猜你喜欢

转载自blog.csdn.net/gs12software/article/details/103288649
今日推荐