Jetpack-Lifecycle简记
Posted Android-kongqw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jetpack-Lifecycle简记相关的知识,希望对你有一定的参考价值。
Jetpack-Lifecycle简记
解决痛点:帮助开发者更方便的管理生命周期
和传统方式对比:
如果把Activity
比作一个老父亲,页面中的子控件比作他的孩子的话。传统的方式,为了防止内存泄漏,老父亲要在生命周期方法中做一系列的管理,如果处理不当或者遗漏,就会因为这些孩子造成内存泄漏。老父亲
就要给这些孩子
擦屎把尿,帮助这些孩子,给他们在onStart()的时候要干啥,在onResume()的时候干啥等等。
Lifecycle 解决的痛点问题就是,父亲不再给这些孩子处理这些问题,只是把自己(Activity)的生命周期告诉孩子
,至于孩子应该做什么,要他自己处理。
举一个列子:
- 创建一个孩子,实现
LifecycleObserver
接口,让他具备接收父亲生命周期变化的能力
Kotlin
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
/**
* 假装是一个视频播放器
*/
class VideoPlayerView(context: Context?, attrs: AttributeSet?) : View(context, attrs), LifecycleObserver
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onFatherCreate()
Log.i("VideoPlayerView", "onFatherCreate() 页面创建好了,开始初始化")
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onFatherStart()
Log.i("VideoPlayerView", "onFatherStart()")
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onFatherResume()
Log.i("VideoPlayerView", "onFatherResume() 页面显示了,开始播放")
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onFatherStop()
Log.i("VideoPlayerView", "onFatherStop()")
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onFatherPause()
Log.i("VideoPlayerView", "onFatherPause() 页面隐藏了,暂停播放")
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onFatherDestroy()
Log.i("VideoPlayerView", "onFatherDestroy() 页面销毁了,释放资源,防止内存泄漏")
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onFatherAny()
// Log.i("VideoPlayerView", "onFatherAny() 父亲的生命发生了变化")
- 老父亲把生命周期告诉孩子
Kotlin
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(video_player_view)
- 运行:
I/VideoPlayerView: onFatherCreate() 页面创建好了,开始初始化
I/VideoPlayerView: onFatherStart()
I/VideoPlayerView: onFatherResume() 页面显示了,开始播放
I/VideoPlayerView: onFatherPause() 页面隐藏了,暂停播放
I/VideoPlayerView: onFatherStop()
I/VideoPlayerView: onFatherDestroy() 页面销毁了,释放资源,防止内存泄漏
--------- 2022年02月17日 更新 -----------
implementation 'androidx.appcompat:appcompat:1.4.1'
appcompat:1.4.1
版本@OnLifecycleEvent
过时,推荐使用DefaultLifecycleObserver
或LifecycleEventObserver
。
Annotation that can be used to mark methods on @link LifecycleObserver implementations that should be invoked to handle lifecycle events.
@deprecated This annotation required the usage of code generation or reflection, which should be avoided. Use @link DefaultLifecycleObserver or @link LifecycleEventObserver instead.
例:
class CustomView2(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs), DefaultLifecycleObserver
override fun onCreate(owner: LifecycleOwner)
super.onCreate(owner)
Log.i("CustomView2", "onParentCreate")
override fun onResume(owner: LifecycleOwner)
super.onResume(owner)
Log.i("CustomView2", "onResume")
class CustomView3(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs), LifecycleEventObserver
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event)
Log.i("CustomView3", "onStateChanged($source, $event)")
以上是关于Jetpack-Lifecycle简记的主要内容,如果未能解决你的问题,请参考以下文章