美文网首页
Lifecycles应用总结

Lifecycles应用总结

作者: Hiper | 来源:发表于2022-03-23 15:00 被阅读0次

    在编写Android应用程序的时候,可能会经常遇到需要感知Activity生命周期的情况。比如说,某个界面中发起了一条网络请求,但是当请求得到响应的时候,界面或许已经关闭了,这个时候就不应该继续对响应的结果进行处理。因此,我们需要能够时刻感知到Activity的生命周期,以便在适当的时候进行相应的逻辑控制。
    问题在于,在一个Activity中去感知它的生命周期非常简单,而如果要在一个非Activity的类中去感知Activity的生命周期,应该怎么办呢?

    (最新)继承DefaultLifecycleObserver接口

    Kotlin版本,继承DefaultLifecycleObserver接口,直接重写所需的方法,然后在被监听的Activity中添加MyObserver即可。

    class MyObserver : DefaultLifecycleObserver {
        private val TAG = "MyObserver"
        override fun onCreate(owner: LifecycleOwner) {
            super.onCreate(owner)
            Log.d(TAG, "on Create")
        }
        override fun onDestroy(owner: LifecycleOwner) {
            super.onDestroy(owner)
            Log.d(TAG, "on Destroy")
        }
        override fun onStart(owner: LifecycleOwner) {
            super.onStart(owner)
            Log.d(TAG, "on Start")
        }
        override fun onResume(owner: LifecycleOwner) {
            super.onResume(owner)
            Log.d(TAG, "on Resume")
        }
        override fun onPause(owner: LifecycleOwner) {
            super.onPause(owner)
            Log.d(TAG, "on Pause")
        }
        override fun onStop(owner: LifecycleOwner) {
            super.onStop(owner)
            Log.d(TAG, "on Stop")
        }
    }
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            lifecycle.addObserver(MyObserver())
        }
    }
    

    也可以在MainActivity中直接定义接口的抽象类

    lifecycle.addObserver(object : DefaultLifecycleObserver {
        override fun onCreate(owner: LifecycleOwner) { 
            super.onCreate(owner)
            Log.d("MyObserver", "on Created")
            owner.lifecycle.removeObserver(this)
        }
    })
    

    最后不要忘了移除掉添加的观察者

    原理分析

    自己手写监听器

    首先自己手写一个简单的监听器

    可以看到,这里我们为了让MyObserver能够感知到Activity的生命周期,需要专门在
    MainActivity中重写相应的生命周期方法,然后再通知给MyObserver。这种实现方式虽然是
    可以正常工作的,但是不够优雅,需要在Activity中编写太多额外的逻辑。

    class MyObserver {
        fun activityStart() {
        }
        fun activityStop() {
        }
    }
    
    class MainActivity : AppCompatActivity() {
        lateinit var observer: MyObserver
        override fun onCreate(savedInstanceState: Bundle?) {
            observer = MyObserver()
        }
        override fun onStart() {
            super.onStart()
            observer.activityStart()
        }
        override fun onStop() {
            super.onStop()
            observer.activityStop()
        }
    }
    

    借用注解

    https://blog.csdn.net/vitaviva/article/details/121224946
    这里需要好好梳理一下。

    可以看到,我们在方法上使用了@OnLifecycleEvent注解,并传入了一种生命周期事件。生
    命周期事件的类型一共有7种:ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、
    ON_STOP和ON_DESTROY分别匹配Activity中相应的生命周期回调;另外还有一种ON_ANY类
    型,表示可以匹配Activity的任何生命周期回调。

    class MyObserver() : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun activityStart() {
            Log.d("MyObserver", "activityStart")
        }
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun activityStop() {
            Log.d("MyObserver", "activityStop")
        }
    }
    
    class MainActivity : AppCompatActivity() {
        ...
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            ...
            lifecycle.addObserver(MyObserver())
        }
        ...
    }
    

    Lifecycle继承图(Fragment)

    https://blog.csdn.net/zhuzp_blog/article/details/78871374

    image.png

    相关文章

      网友评论

          本文标题:Lifecycles应用总结

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