Activity生命周期分析

1.1经典生命周期分析

正常情况下Activity的生命周期:
1)onCreate:表示Activity正在被创建,这是Activity生命周期的第一个方法,通常用于做初始化的一些工作,如setContentView加载布局xml文件,初始化Activity需要的数据等;

2)onRestart:表示Activity正在重新启动.为什么说是”重新”启动呢?.如果Acitivity是第一次创建,此时的生命周期如下:onCreate–>onStart–>onResume,并不会触发此生命周期.一般情况下Activity从不可见状态到重新可见状态,onRestart就会被调用,一般由用户行为导致,如:按Home键回到手机桌面或者打开另外一个新的Activity,此时当前的Activity就会执行onPause,onStop,用户由新的Activity/手机桌面再次回到当前Activity,onRestart就会被调用;

3)onStart:表示Activity正在启动.此时Activity的状态是可见的,但是还没出现在前台,不能与用户交互.

4)onResume:表示Activity的状态是可见的,且在前台,能与用户进行交互.

5)onPause:表示Activity正在停止,一般而言,此Activity的onStop会接着被调用,但也有特殊情况,有A-Activity跳转到B-Activity,再极速返回到A-Activity,此时A-Activity触发的是onResume,而非onStop,当然,手动复现这种操作几乎不大可能.此生命周期中适合做一些不大耗费性能的操作,如保存简单的数据,结束动画等,不建议有耗时操作为什么呢?举个例子:从A-Acitivity跳转到B-Activity,其生命周期触发过程如下:A-onPause–>B-onCreate–>B-onStart–>B-onResume–>A-onStop,由此可见,如果在A-Activity中的onPause中如果有耗时操作,则影响B-Activity中创建速度,从用户操作体验上就会有明显的卡顿.

6)onStop:表示Acitivity即将停止,较onPause而言,在此生命周期中可以做一些稍微重量级点的回收工作,但也不能有太耗时的操作.

7)onDestory:表示Acitivity即将被销毁.在此生命周期中一般可用做些资源回释放工作.

补充说明:

  • A-Acitivity跳转到B-Activity,正常的生命周期:A-onPause–>B-onCreate–>B-onStart–>B-onResume–>A-onStop,如果A-Activity的主题是透明的,上述生命周期的A-onStop则不会触发
  • onStart和onResume或者onStop与onPause的区别:
    onResume,onPause:从Activity是否在前台角度调用
    onStart,onStop:从Activity是否可见角度调用

从整个生命周期来看:

  • onCreate对应onDeStory,分别表示Activity的创建和销毁;
  • onStart对应onStop,常见的手机亮屏和息屏操作
  • onResume对应onPause,常见的手机亮屏和息屏操作

1.2异常情况下的生命周期分析

a.资源相关的系统配置发生改变而导致Activity被销毁并重建
例如横竖屏切换操作(Activity不做特殊处理的情形):
异常情况下Activity的重建过程
当Activity在异常情况下被销毁的时候,onSaveInstanceState方法会被触发,用于保存Activity的当前ui状态(视图结构),这个方法的调用时机是在onStop之前,它和onPause没有必定的前后关系.当Activity重新被创建时,onRestoreInstanceState会被调用(我们可以在此方法中通过Bundle保存自己需要的参数),并把onSaveInstanceState保存的Bundle对象做为参数传递给onRestoreInstanceState和onCreate方法,我们通常可用这个Bundle对象是否为null判断此Activity是否重建了,如果重建了,我们可以取出之前保存的参数并回复.从时序上来说,onRestoreInstanceState会在onStart之后调用.
注:系统恢复View中的哪些数据,可以自行看下view中的onSaveInstanceState和onRestoreInstanceState的具体实现.另外,onCreate和onRestoreInstanceState均接受了Bundle,区别在于onCreate中的bundle需要判断是否为空,而如果onRestoreInstanceState被调用了,其中的bundle必定不为空

b.内存不足导致优先级低的Activity被回收
此情况下的数据保存和恢复跟a中的过程是一致的.Activity的优先级从高到底,可分为如下三种情况:

  1. 前台Activity:正在和用户交互的Activity优先级最高;
  2. 可见但非前台Activity:如在Activity中弹窗,导致Activity可见但在后台,无法与用户直接交互.
  3. 后台Activity:已经被暂停的Activity,执行了onStop,优先级最低

问题来了,当系统配置改变后,如果保证该Activity不被重新创建呢?
可以给Activity指定configChanges属性并添加对应属性,如横竖屏切换的”orientation”等,当然还有很多系统配置,如系统语言发生改变,指定locale(app语言国际化需要注意这块),开启夜间模式需要添加uiMode等等,具体可以参考下图,如需要添加多个,可用”|”拼接.
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Alrict/article/details/81781445