美文网首页MVVM
Lifecycle的使用

Lifecycle的使用

作者: dashingqi | 来源:发表于2020-06-21 18:06 被阅读0次
Android_Banner.jpg

简介

  • Lifecycle是一个类,用于存储有关组件(Activity、Fragment)的生命周期状态的信息,并且允许其他对象观察此状态

  • Lifecycle主要使用两种枚举跟踪相关组件的生命周期状态

    • Event(事件):从框架和Lifecycle类分派的生命周期事件。这些事件映射到Activity和Fragment中的回调事件

    • Statest(状态):由Lifecycle对象跟踪的组件的当前状态

    • 用一张图来描述上述的Event和State

      Lifecycle
      • 当我们的状态处于CREATE时候,说明onCreate已经执行了,但是onStart并没有执行,当处于STARTED状态的时候,说明onStart方法已经执行了,但是onResume并没有执行
      • 注意:当onStop方法执行的时候,状态时处于CREATED的。

使用

Lifecycle感知Activty的生命周期
  • 新建观察者MyObserver

    class MyObserverDemo : LifecycleObserver {
    
    
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun performOnStart() {
            Log.d(Companion.TAG, "performOnStart ")
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun performOnStop() {
            Log.d(Companion.TAG, "performOnStop ")
        }
    
        companion object {
            private const val TAG = "MyObserverDemo"
        }
    
    }
    
    • 我们新建一个MyObserverDemo类,实现了LifecycleObserver接口,LifecycleObserver是属于Lifecycle工具包中的
    • 我们在方法上使用了@OnLifecycleEvent注解,并且传入了对应事件的类型,该事件类型分别有如下几种(前六种事件分别对应这个组件的生命周期)
      • ON_CREATE
      • ON_START
      • ON_RESUMR
      • ONPAUSE
      • ON_STOP
      • ON_DESTORY
      • ON_ANY:表示可以匹配组件任何的生命周期的回调
    • 上述的perfromOnStop()和perfromOnStart会在组件的onStart和onStop执行的时候被回调执行
    • 上述只是建立好了感知组件对应生命周期的观察者对象,还要在组件中去通知到观察者对象
  • 通过LifeCycle去观察LifecycleOwner的生命周期

    • 在我们要去通知给对应的观察者对象的时候,我们需要写如下的代码

      lifecycleOwner.lifecycle.addObserver(MyObserverDemo())
      
    • 在AndroidX中我们的AppCompatActivity或者Fragment都是实现了LifecycleOwner接口,所以我们可以在Activity或者Fragment通过上述的代码,来通知观察者

    • 代码如下

      class LifecycleActivity : AppCompatActivity() {
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_lifecycle)
              //重点是下面这个方法
              lifecycle.addObserver(MyObserverDemo())
          }
      }
      
  • 运行结果如下

    //程序开启时的log
    2020-06-21 17:18:49.016 30782-30782/com.dashingqi.lifecycledemo D/MyObserverDemo: performOnStart 
    //将程序退到后台的log
    2020-06-21 17:19:46.256 30782-30782/com.dashingqi.lifecycledemo D/MyObserverDemo: performOnStop 
    
自定义LifecycleOwner

上述都是在AppCompatActivity前提下,去实现生命周期的感知,我们知道AppCompatActivity是实现了LifecycleOwner接口的,

如果这时候我们单纯时继承Activity想要感知生命周期该怎么办呢?

其实也是一样的,实现LifecycleOwner接口,也就是所谓的自定义LifecycleOwner

  • 继承Activity,实现LifecycleOwner接口

    class ExtendsActivity : Activity(), LifecycleOwner {
        private var lifecycleRegistry: LifecycleRegistry? = null
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_extends)
            //第一步:新建LifecycleRegister
            lifecycleRegistry = LifecycleRegistry(this)
            //第二步:设置lifecycleRegister的各种状态
            lifecycleRegistry!!.currentState = Lifecycle.State.CREATED
            //第三步:通知给对应的观察者对象
            lifecycle.addObserver(MyObserverDemo(lifecycle))
    
        }
    
        override fun onStart() {
            super.onStart()
            lifecycleRegistry!!.currentState = Lifecycle.State.STARTED
        }
    
        override fun onStop() {
            super.onStop()
            lifecycleRegistry!!.currentState = Lifecycle.State.CREATED
        }
    
        /**
         * 实现了LifecycleOwner接口,实现了该方法,返回了lifecycleRegistry对象
         */
        override fun getLifecycle(): Lifecycle {
            return lifecycleRegistry!!
        }
    }
    
    • LifecycleRegister是继承了Lifecycle类的
补充一点
  • 除了使用LifecycleObserver之外,还可以使用DefaultLifecycleObserver,同样都是用来感知组件的生命周期方法的

  • DefaultLifcycycleObser中为我们提供对应的生命周期方法,我们只需重写即可,

  • 代码如下

    class Java8Observer : DefaultLifecycleObserver {
    
        override fun onCreate(owner: LifecycleOwner) {
    
        }
    
        override fun onResume(owner: LifecycleOwner) {
            Log.d(Companion.TAG, "performOnStart ")
        }
    
        override fun onStop(owner: LifecycleOwner) {
            Log.d(Companion.TAG, "performOnStop ")
        }
    
        companion object {
            const val TAG = "Java8Observer"
        }
    }
    
  • 运行结果如下

    2020-06-21 18:00:28.497 32403-32403/com.dashingqi.lifecycledemo D/Java8Observer: performOnStart
    

相关文章

网友评论

    本文标题:Lifecycle的使用

    本文链接:https://www.haomeiwen.com/subject/xlvaxktx.html