美文网首页移动APP产品体验Android开发Android知识
谈谈Activity正常/异常的生命周期

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

作者: daking | 来源:发表于2016-09-02 11:54 被阅读423次

    正常的生命周期分析

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

    我的博客

    相关文章

      网友评论

        本文标题:谈谈Activity正常/异常的生命周期

        本文链接:https://www.haomeiwen.com/subject/ijwhettx.html