• 面试:activity生命周期


    唠唠 Activity 的生命周期

    Android 复习笔记 —— 唠唠 Activity 的生命周期 - 知乎

    每个生命周期做了什么?

    onCreate()

    这是 Activity 的第一个生命周期方法,其中必须要做的操作就是 setContentView()

    setContentView() 里面大概做了这么几件事:

    1. 创建 DecorView,并设置 PhoneWindow
    2. 解析 xml 布局文件,生成 View 对象并塞到 DecorView 中

    此时 DecorView 并没有被绘制,Window 对象也没有被显示到屏幕,Activity 也是不可见的。

    除此之外,开发者通常也会在 onCreate() 方法中做一些数据的初始化操作。

    onCreate() 在一次完整的生命周期中只会回调一次,它也不是一个长驻状态,完成工作只会就会进入 onStart() 。

    onStart()

    onStart() 也不是一个长驻状态,官方文档对于它的描述是这样的:

    The onStart() call makes the activity visible to the user, as the app prepares for the activity to enter the foreground and become interactive.

    在 onStart() 方法中,Activity 对用户可见,应用准备进入前台和用户交互。我对这句 Activity 对用户可见 其实抱有很大的疑问。

    不考虑特殊情况,正常启动一个 Activity,onCreate -> onStart ,此时所谓的 “可见”,见到的是什么?

    这个问题在下面的 onResume 一节中会详细说明,读者可以先仔细揣摩一下。

    onStart() 方法中可以做些什么呢?通常会和 onStop() 搭配做一些资源申请和释放的工作,例如相机的申请和释放。

    onResume

    熟悉 UI 绘制流程的读者肯定知道,onResume() 是真正进行 UI 绘制以及显示的地方。其中的核心逻辑就是 WindowManager.addView() 方法,实际调用的是 WindowManagerGlobal.addView() 方法。它大致干了这么几件事:

    1. 创建 ViewRootImpl 对象
    2. 调用 ViewRootImpl.setView() 方法

    ViewRootImpl 的构造函数中做了这么几件事:

    1. 初始化跟 WMS 通信的 WIndowSession 对象,这是一个 Binder 对象
    2. 初始化 Choreographer 对象

    ViewRootImpl.setView() 方法做了这么几件事:

    1. 调用 requestLayout() 方法,发起绘制
    2. Binder 调用 WMS.addToDisplay() 方法,将 window 添加到屏幕

    requestLayout() 方法中就会进行我们所熟知的 测量、布局和绘制 流程,但并不是直接进行的,它依赖 vsync 信号。requestLayout() 只是通过前面已经初始化了的 Choreographer 对象进行注册监听,当下一个 vsync 信号来临时,会回调 performTraversals() 方法,这其中就会真正的进行测量、布局和绘制。

    整个 UI 绘制流程的知识点很多,仅靠以上简单一段文字肯定是无法完全概括的,感兴趣的读者可以自己去翻翻源码。但是我们可以肯定是,onResume 是真正的用户界面可见的时机。

    再回到之前的问题,onStart 中可见的是什么?我也无法回答这个问题,或者可能大家都曲解了官方文档的意思,是否应该理解为 “Activity 即将可见”。大家可以在留言区说说你的看法。

    同样,onResume() 通常也可以和 onPause() 搭配做一些资源申请和释放的工作。那么,既然 onStart/onStop 和 onResume/onPause 都可以,该如何选择呢?同样放到后面进行解答。

    onPause

    onPause() 是一个很短暂的过程,之后如果用户返回了之前的 Activity,则会回调 onResume 。如果没有,则会回调 onStop 。

    给 onPause 一个精准的描述的话,应该是 非前台,不可交互,但不一定不可见 。对于系统来说,无论是手机还是 PC ,同一个时间一定只有一个处于前台,获取焦点,且可与用户交互的活动窗口,所以 非前台,不可交互 很好理解。那 不一定不可见 如何理解呢?其实也很简单,类似 PC 的多窗口,Android 系统也是有多窗口模式的。

    最后,注意 onPause 中不建议进行重量级的耗时操作,因为在 Activity 跳转过程中,前一个 Activity 的 onPause() 是发生在后一个 Activity 的任何生命周期之前的。

    onStop

    完全的不可见状态。但此时的 Activity 仍在内存中,只是没有关联到任何 Window 。如果后续有机会再次返回,则会回调 onRestart -> onStart 。

    onDestroy

    onStop 之后没有被用户捞回去,最后就得被销毁。主动的调用 finish 或者系统配置改变也会可能导致销毁。

    注意在 onDestroy 中释放所有不需要的资源,否则可能导致内存泄露。

  • 相关阅读:
    【10套模拟】【7】
    数字IC验证——PSS可移植测试用例
    中国电子云数据库 Mesh 项目 DBPack 的实践
    【微服务的集成测试】python实现-附ChatGPT解析
    JVM学习总结(一)
    Postgresql 学习记录,模式,分区表,触发器,事务,窗口函数,视图,建表,约束等
    <Redis开发与运维>一书阅读笔记记录
    小白学习-ElasticSearch教程(5) -批量操作之bulk | 条件查询 | 其它查询
    2023全新付费进群系统源码 带定位完整版 附教程
    window开机自动运行python脚本
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/127733631