简介
developer.android.com/guide/compo…
特别是在初始化与释放资源的这难点上,只有深入理解了Activity的生命周期才会让你不会出现以下问题
1.各种资源提早释放导致空指针
2.各种资源初始化过慢导致空指针
3.资源释放失败导致内存泄露
4.反复初始化导致性能开销大的问题。
onCreate
特性
onCreate是Activity创建时的第一个生命周期,并且只会执行一次
onCreate执行时Activity处于不可见状态
在这个方法中我们会初始化当前布局setContentLayout()方法
onCreate执行时Activity的View并没有测量尺寸绘制,这个时候View的宽高值为0。
建议
不建议进行耗时初始化
建议只需要进行只需要一次初始化的View的初始化,比如View的初始化,对话框的初始化,ViewModel的初始化
获取Intent里传入的值
onStart
特性
当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。
可以被onRestart重新调用
建议
不建议进行耗时初始化
View的动画初始化与开启
一些需要在后台暂停后又重新恢复的初始化,比如一些包含操作View的Handler的重新初始化
视频播放与相机拍照等等功能的重新初始化(比如:Camera2、VideoView)
onResume
特性
当前activity状态属于运行状态 (Running),可与用户进行交互
建议
1.在重新运行onResume情况下,可以考虑重新恢复视频播放,注意只是将暂停播放的视频后的重新恢复。并不是重新初始化视频播放组件
2.可以考虑Camera预览可以在这里开启。在重新运行onResume情况下,恢复Camera预览。
3.可以考虑动画在这里开启。在重新运行onResume情况下,恢复一些动画View的动画效果。
4.在重新运行onResume情况下,恢复需要与操作View有关的Callback或者Listener。
5.进行超级耗时的初始化与加载,建议显示一个等待对话框。这样页面已经显示了,用户也能看到等待对话框。(但是,因为onResume容易反复调用需要注意需要利用onRestart生命周期做好判断,防止已经初始化过的资源,进行反复耗时初始化)
onPouse
特性
1.Activity在不在前台时,比如一个Dialog模式的Activity启动后,处于背景半透明置灰的情况的这个Activity也会触发onPouse
2.onPouse触发时,Activity可能处于瞬间可见状态,并可以进行焦点操作。
3.如果是正常快速跳转Activity,在进入下一个Activity的瞬间触发onPouse,这个时候在马上按返回键会直接触发onResume(不经过onStart生命周期)。
4.在onPouse生命周期里做耗时的操作,否则会让Activity在跳转时有明显的延迟
建议
1.暂停视频播放
2.暂停摄像拍照预览
3.暂停动画
4.保存一些需要永久保存的UI值。
5.保存一些UI的临时值,方便下一次执行onResume的时候恢复显示。比如一些UI单选结果、多选结果,EditText里的内容。
6.释放与操作View有关的Callback或者Listener
onStop
特性
1.onPouse()方法完成之后,此时activity进入onStop()方法
2.在此生命周期Activity对用户是不可见的
3.在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。
4.在这个生命周期下操作View会报错
建议
1.假设有Handler需要处理View,那么需要在这个生命周期里移除Handler里的所有待发消息。(handler.removeCallbacksAndMessages(null);)
2.释放Camera2或者Camera的资源。
3.释放视频播放VideoView的资源。
4.需要耗时释放的资源与后台操作建议放到此处进行。
onRestart
特性
1.onRestart()方法在用户按下home()之后,再次进入到当前activity的时候调用。
调用顺序onPouse()->onStop()->onRestart()->onStart()->onResume().
2.导航回Activity,下个函数是onStart()可以判断是恢复还是首次创建Activity。
建议
1.增加一些判断给后续onStart或者onResume的生命周期里确定此activity是首次启动还是进入后台恢复的。这样可以避免一些重量级资源重复初始化。
onDestroy
特性
1.Activity被销毁钱最后一个被调用的方法。
2.Activity不可见。
3.在这个生命周期下操作View会报错。
4.这个生命周期并不会在Activity进入后台后马上执行,是否执行释放Activity是交给系统决定的。所以有概率执行onDestroy方法会延后。
建议
1.释放一些实例节约空间,如置空List集合、Bean数据等。
2.操作耗时释放的资源。
3.置空Handler。
生命周期感知型组件
一些占用资源的帮助类,在activity销毁时需要释放掉资源
这类组件与activity生命周期相关联,当activity执行生命周期函数时,
系统将调用带有 @OnLifecycleEvent 注释的方法,以使生命周期感知型组件可以执行已创建状态所需的任何设置代码。
/**
* 生命周期组件
*/
class LifeComponent : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
Log.e("LifeComponent", "onCreate")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
Log.e("LifeComponent", "onStart")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
Log.e("LifeComponent", "onResume")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {
Log.e("LifeComponent", "onPause")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() {
Log.e("LifeComponent", "onStop")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
Log.e("LifeComponent", "onDestroy")
}
}
观察实现LifecyclerOwner接口的Activity,如FragmentActivity,也可自己写Activity实现LifecyclerOwner接口
可阅读源码看如何实现的
class LifecycleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(LifeComponent())
}
}
若有收获,就点个赞吧