• Android开发 Activity生命周期详解


    前言

      在一般情况下了解Activity的生命周期后,都很容易认为自己已经理解了生命周期。并且可能会觉得实际运用起来并不需要这么多的生命周期来处理activity。但是Activity的生命周期的设计理念远远不止是让你知道Activity是在创建还是前台还是在后台或者销毁这般简单。特别是在初始化与释放资源的这难点上,只有深入理解了Activity的生命周期才会让你不会出现以下问题

    1.各种资源提早释放导致空指针

    2.各种资源初始化过慢导致空指针

    3.资源释放失败导致内存泄露

    4.反复初始化导致性能开销大的问题。

    生命周期流程图

    讲解生命周期

    onCreate

    特性:

    1. onCreate是Activity创建时的第一个生命周期,并且只会执行一次
    2. onCreate执行时Activity处于不可见状态
    3. 在这个方法中我们会初始化当前布局setContentLayout()方法
    4. onCreate执行时Activity的View并没有测量尺寸绘制,这个时候View的宽高值为0。

    建议:

    1. 不建议进行耗时初始化
    2. 建议只需要进行只需要一次初始化的View的初始化,比如View的初始化,对话框的初始化,ViewModel的初始化
    3. 获取Intent里传入的值

    onStart

    特性:

    1. onCreate()方法完成后,此时activity进入onStart()方法
    2. 当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。
    3. 可以被onRestart重新调用

    建议:

    1. 不建议进行耗时初始化
    2. View的动画初始化与开启
    3. 一些需要在后台暂停后又重新恢复的初始化,比如一些包含操作View的Handler的重新初始化
    4. 视频播放与相机拍照等等功能的重新初始化(比如:Camera2、VideoView)

    onResume

    特性:

    1. onStart()方法完成之后,此时activity进入onResume()方法中
    2. 当前activity状态属于运行状态 (Running),可与用户进行交互

    建议:

    1. 在重新运行onResume情况下,可以考虑重新恢复视频播放,注意只是将暂停播放的视频后的重新恢复。并不是重新初始化视频播放组件
    2. 可以考虑Camera预览可以在这里开启。
    3. 在重新运行onResume情况下,恢复Camera预览。
    4. 可以考虑动画在这里开启。
    5. 在重新运行onResume情况下,恢复一些动画View的动画效果。
    6. 在重新运行onResume情况下,恢复需要与操作View有关的Callback或者Listener。
    7. 进行超级耗时的初始化与加载,建议显示一个等待对话框。这样页面已经显示了,用户也能看到等待对话框。(但是,因为onResume容易反复调用需要注意需要利用onRestart生命周期做好判断,防止已经初始化过的资源,进行反复耗时初始化)

    onPouse

    特性:

    1. Activity在不在前台时,比如一个Dialog模式的Activity启动后,处于背景半透明置灰的情况的这个Activity也会触发onPouse
    2. 注意!onPouse触发时,Activity可能处于瞬间可见状态,并可以进行焦点操作。
    3. 如果是正常快速跳转Activity,在进入下一个Activity的瞬间触发onPouse,这个时候在马上按返回键会直接触发onResume(不经过onStart生命周期)。
    4. 在这个生命周期里View是还能被操作并且不会报错的。(比如改变TextView的字体颜色,字体大小等等操作)
    5. 在启动另外一个Activity时,需要先回调当前前台Activity的onPouse生命周期,才能回调需要启动Activity的onCreate() -> onStart() -> onResume(),这就意味着请不要在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. 判断下一个生命周期onStart()是Activity恢复还是首次创建Activity。

    建议:

      1.增加一些判断给后续onStart或者onResume的生命周期里确定此activity是首次启动还是进入后台恢复的。这样可以避免一些重量级资源重复初始化。

    onDestroy

     特性:

    1. Activity被销毁钱最后一个被调用的方法。
    2. Activity不可见。
    3. 在这个生命周期下操作View会报错。
    4. 这个生命周期并不会在Activity进入后台后马上执行,是否执行释放Activity是交给系统决定的。所以有概率执行onDestroy方法会延后。

    建议:

    1. 释放一些实例节约空间,如置空List集合、Bean数据等。
    2. 操作耗时释放的资源。
    3. 置空Handler。

    常见情况生命周期的执行顺序

    第一次启动 onCreate() -> onStart() -> onResume()
    从 A 跳转到 B A_onPause() -> B_onCreate() -> B_onStart() -> B_onResume() -> A_onStop()
    从 B 再次回到 A B_onPause() -> A_onRestart() -> A_onStart() -> A_onResume() -> B_onStop()
    用户按 home 键 onPause() -> onStop()
    按 home 键后回到应用 onRestart() -> onStart() -> onResume()
    用户按电源键屏保 onPause() -> onStop()
    用户按电源键亮屏 onRestart() -> onStart() -> onResume()
    用户按 back 键回退 onPause() -> onStop() -> onDestroy()

    End

  • 相关阅读:
    解析Javascript事件冒泡机制(转)
    JavaScript事件处理的三种方式(转)
    javaScript中"=="和"==="运算符的区别
    博客
    基础知识巩固二
    基础知识巩固
    知识小结(浮点数问题)
    关于电脑桌面图标消失并且右键无法点击的情况
    JS随笔(二)
    关于JS学习笔记
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/12539152.html
Copyright © 2020-2023  润新知