谈谈Activity正常/异常的生命周期

正常的生命周期分析

Activity各回调方法

  1. onCreate

    • 何时:Activity正在被创建。
    • 作用:进行初始化工作,如setContentView(界面资源)、初始化Activity所需数据。
    • 注意:此方法的传参Bundle为该Activity上次被异常情况销毁时保存的状态信息。
  2. onRestart

    • 何时:Activity正在重新启动。当前Activity从不可见重新变为可见。
  3. onStart

    • 何时:Activity正在被启动。此时Activity已可见,但还不在前台,还无法和用户交互。
  4. onResume

    • 何时:Activity已在前台
  5. onPause

    • 何时:Activity正在停止。当前Activity已不在前台
    • 作用:你需要保存更改到持久数据、停止一些动画、停止一些耗时CPU操作等。
    • 注意:
      1. 此方法不可做耗时操作。onPause()必须先执行完,新Activity的onResume()才会执行。
      2. 正常情况下,onStop()会紧接着被调用,但若此时快速地再回到当前Activity,那么onResume()会被调用。(极端情况,难以重现)
  6. onStop

    • 何时:Activity即将停止。当前Activity已不可见
    • 作用:在此方法中,可做一些稍微重量级的回收工作,如:取消网络连接、注销广播接收器等。
  7. onDestroy

    • 何时:Activity即将被销毁。
    • 作用:做回收工作和最终的资源释放。

生命周期的切换过程

谈谈Activity正常/异常的生命周期_第1张图片
Activity生命周期
  1. 第一次启动,回调如下:onCreate -> onStart -> onResume
  2. 当用户打开新的Activity时,回调如下:A onPause -> B onCreate -> B onStart -> B onResume -> A onStop。注意,若新的Activity采用了透明主题,那么当前Activity不会回调onStop
  3. 当用户再次回到原Activity时,回调如下:onRestart -> onStart -> onResume
  4. 当前Activity在前台,用户按back键时,回调如下:onPause -> onStop -> onDestroy
  5. 当前Activity在前台,用户按Home键时,回调如下:onPause -> onStop
  6. 当前Activity在前台,用户锁屏时,回调如下:onPause -> onStop

生命周期的各阶段

  1. 完整生命周期

    • Activity在onCreate()onDestroy()之间所经历的。
    • onCreate()中完成各初始化操作;在onDestroy()中释放资源。
  2. 可见生命周期

    • Activity在onStart()onStop()之间所经历的。
    • 活动对于用户是可见的,但仍无法与用户进行交互。
  3. 前台生命周期

    • Activity在onResume()onPause()之间所经历的。
    • 活动可见,且可交互。

异常的生命周期分析

onSaveInstanceStateonRestoreInstanceState

  1. Activity的onSaveInstanceStateonRestoreInstanceState

    1. 出现异常情况;
    2. Activity被销毁,回调onPause -> onStop -> onDestroy
    3. 因为Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。此方法在onStop之前调用。它与onPause没有既定的时序关系。
    4. Activity被重新创建,回调onCreate -> onStart -> onResume
    5. 系统会将上次异常终止时保存的状态传递onRestoreInstanceStateonCreateonRestoreInstanceStateonStart之后被调用
  2. View的onSaveInstanceStateonRestoreInstanceState

    1. 出现异常情况;
    2. Activity被销毁,系统会默认保存当前Activity的视图结构:
      1. Activity调动onSaveInstanceState去保存数据;
      2. 然后Activity会委托Window去保存数据;
      3. Window再委托它的顶级ViewGroup去保存数据;
      4. 其顶级ViewGroup再一一调用它的子视图View的onSaveInstanceState来保存数据。
    3. Activity被重新创建,系统会恢复上次异常终止时保存的视图结构,其onRestoreInstanceState流程与上面类似,也是上层委托下层。

内存不足导致的生命周期

  • Activity的优先级

    1. 前台Activity —— 正在和用户交互,优先级最高;
    2. 可见但不在前台的Activity —— 比如Activity中有弹窗,导致其可见但不在前台,无法与用户交互;
    3. 后台Activity —— 已被停止的Activity,比如执行onStop,优先级最低。
  • 当系统内存不足时,会按照Activity优先级从低到高去杀死目标Activity所在的进程。

  • 若一个进程没有四大组件在执行,那么这个进程将很快被系统杀死。

系统配置改变导致的生命周期

  • 当系统配置发生改变后,Activity会被销毁且重新创建。

  • 系统配置中有很多内容,若当某项内容发生改变后,我们不想系统重新创建Activity,可给Activity指定configChanges属性。之后当指定的系统配置项发生改变时,Activity不会被重新创建,系统仅仅回调其void onConfigurationChanged(Configuration newConfig);

    android:configChanges="orientation|keyboardHidden|locale"
    
系统配置项 含义
mcc SIM卡唯一标识IMSI中的国家代码发生改变,三位数字。
中国为460。
mnc SIM卡唯一标识IMSI中的运营商代码发生改变,两位数字。
中国移动TD系统为00,联通为01,电信为03。
locale 设备的本地位置发生改变。
如切换了系统语言。
touchscreen 触摸屏发生改变。
keyboard 键盘类型发生改变。
比如用户使用了外接键盘。
keyboardHidden 键盘的可访问性发生改变。
比如用户调出了键盘。
navigation 系统导航方式发生改变。
如采用了轨迹球导航。
screenLayout 屏幕布局发生改变。
如用户激活了另一个显示设备。
fontScale 系统字体缩放比例发生改变。
uiMode 用户界面模式发生改变。
如开启了夜间模式(API8添加)。
orientation 屏幕方向发生改变。
如旋转手机屏幕。
screenSize 屏幕的尺寸信息发生改变。
minSdkVersiontargetSdkVersion都低于13时,此项不生效。
smallestScreenSize 设备的实际物理屏幕尺寸发生改变,这个项和屏幕的方向没有关系。
比如用户切换到外部的显示设备上。
minSdkVersiontargetSdkVersion都低于13时,此项不生效。
layoutDirection 布局方向发生改变。(API17添加)

我的博客

你可能感兴趣的:(谈谈Activity正常/异常的生命周期)