Android Activity生命周期搬运与理解

Android Activity生命周期搬运与理解

在这里插入图片描述


导读

众所周知Android的Activity生命周期设计从OnCreate开始到OnDestroy完结,那设计Activity的工程师为何要做出这样的设计,每个生命周期方法的意义又是什么呢?知其然,且知其所以然,才能更好帮助我们写出更优秀的代码,今天再次聊聊他们的意义,如你有高见,请在评论区留言


Activity各个生命周期方法

onCreate(Bundle)

调用时机
当Activity被启动(或者横竖屏切换没有配置onConfigChanged)时 ,onCreate会被调用
执行操作
设置视图布局layout,执行一些UI组件初始化工作、配置初始化工作等
注意事项

  1. 此方法调用finish关闭Activity会直接执行onDestroy方法,忽略中间的其他生命周期方法
  2. 异常情况下调用了onSaveInstanceState保存数据后,Activity重新启动后,onCreate的Bundle参数不为空,可以取出之前存储的数据,其他情况参数为null

onStart ()

调用时机
onCreate或者onRestart方法执行后会调用此方法,该方法表明Activity准备展示给用户了
执行操作
可以做一些绘制组件draw,启动动画的操作
注意事项
此方法调用finish关闭Activity会直接执行onStop方法,忽略中间的其他生命周期方法


onResume ()

调用时机
onStart方法执行后会调用此方法,该方法表明Activity可以与用户交互,接收一些用户事件了,并且当前Activity在栈顶
执行操作
可以开启一些独占式的设备或者单例使用的资源,如相机设备等
注意事项
在Android Q版本以后,Android具有多个任务同时工作的情况,所以多个Activity的onResume可能同时恢复工作,但是要判断谁在栈顶可以通过onTopResumedActivityChanged(boolean)来判断


onPause ()

调用时机
onResume执行后,启动新的Activity或者关闭当前Activity会调用onPause方法
执行操作
可以关闭一些独占式的设备或者单例使用的资源,如相机设备等,当启动一个新的Activity时,必须要当前onPause方法执行完成返回后,才会去启动新的Activity,所以不要在此方法中执行比较耗时的操作
注意事项

  1. 为了加快启动新的Activity,当旧的Activity执行完成onPause会立即去执行新Activity的onCreate/onStart/onResume,从而在执行旧Activity的onStop方法
  2. 可以在onPause做一些持久数据的保存工作,异常情况下旧Activity可能会被kill掉,所以当启动新Activity后,旧Activity的剩余生命周期方法可能得不到执行
  3. 为了加快新Activity,onPause建议关闭一些耗时CPU较高的工作

onStop ()

调用时机
当Activity对用户不可见时,会执行此方法;正常情况下,onPause执行后会执行onStop,某些异常情况下如onCreate执行finish后不会执行此方法
执行操作
与onStart对应,执行关闭一些动画操作,停止视图刷新等工作
注意事项
不要做一些保存数据的操作;该方法后续可能会执行onRestart/onDestroy操作


onDestroy ()

调用时机
当Activity准备销毁时调用
执行操作
销毁之前执行资源回收,可解决一些内存泄漏问题
注意事项
不要尝试去做一些保存数据操作,因为在某些异常情况下不一定会调用此方法;异常情况下,Activity有机会会去调用onSaveInstanceState(Bundle)方法,所以保存数据应该在此方法中


onSaveInstanceState(Bundle)

调用时机
异常情况下Activity被销毁时调用,用于保存数据到Bundle中,在onCreate和onRestoreInstanceState(Bundle) 中恢复数据
执行操作
保存持久数据,用于重启Activity时恢复


那么Android设计师会什么要设计如此诸多的方法呢?

设计师应该是遵从面向对象的设计,对Acitivity进行抽象封装,抽象出三个状态,不同状态设计不同的方法。

未初始化状态
当一个页面什么都没有的时候,这个时候要执行最基础的初始化工作,于是设计了onCreate

可见状态
当页面可见时,但还未处于前台,没有获取焦点,这个时候就应可以做一些启动组件相关的工作,绘制组件或者动画等,设计了onStart

前台状态
这个状态,Activity可见并且可以和用户交互,接收事件了,这个时候Activity权限是最大的,一些重大的资源,独享资源都应该赋予它,它想要什么就给什么,所以执行对硬件资源启动应该就在这里,从而也设计了onResume

针对上面三个状态设计的三个方法,也对应设计了不同状态的关闭方法,职责分离吧!不能所有的状态一个方法就结束掉,因为这个三个状态可能会切换的;

总结

所以在面向对象设计时,可以参考“状态-方法”这种方式来设计,然后在根据状态切换去修改每个方法的执行操作,以及调用时机,增加不同状态切换的效率问题;最后我们要多看看源码,会学到很多设计的工作!

猜你喜欢

转载自blog.csdn.net/jackzhouyu/article/details/105951159