0%

四大组件的工作过程(二):Activity 的工作过程

1. Activity 启动流程概述

  • Activity 的 startActivity() 方法有好几种重载方式,它们最终都会调用 startActivityForResult() 方法

  • startActivityForResult() 方法的实现中,mParent 代表的是 ActivityGroup,ActivityGroup 最开始被用来在一个界面中嵌入多个子 Activity,但是其在 API 13 中已经被废弃了,系统推荐采用 Fragment 来代替 ActivityGroup

  • ApplicationThread 是 ActivityThread 的一个内部类。从 Instrumentation 的 execStartActivity() 方法源码可知,启动 Activity 的真正的实现由 ActivityManagerNative.getDefault()startActivity() 方法来完成。

  • ActivityManagerService(简称 AMS)继承自 ActivityManagerNative,而 ActivityManagerNative 继承自 Binder 并实现了 IActivityManager 这个 Binder 接口,因此 AMS 是一个 Binder,它是 IActivityManager 的具体实现。在 ActivityManagerNative 中,AMS 这个 Binder 对象采用单例模式对外提供

  • 然后会调用到 AMS 的 startActivity() 方法,然后是 ActivityStackSupervisor 的 startActivity() 方法,然后是 ActivityStackresumeTopActivityLocked() 方法

    Activity 启动子过程

  • ApplicationThread 继承了 ApplicationThreadNative,而 ApplicationThreadNative 则继承了 Binder 并实现了 IApplicationThread 接口。由于 ApplicationThreadNative 被系统定义为抽象类,所以 ApplicationThread 就成了 IApplicationThread 最终的实现者

  • 通过一系列调用,Activity 的启动过程由 ApplicationThread 的 scheduleLaunchActivity() 方法完成。在 ApplicationThread 中,scheduleLaunchActivity() 的实现很简单,就是发送一个启动 Activity 的消息交由 Handler 处理

  • 然后 Activity 的启动过程由 ActivityThread 的 handleLaunchActivity() 方法来实现,最终 performLaunchActivity() 方法完成了 Activity 对象的创建和启动过程。并且 ActivityThread 通过 handleResumeActivity() 方法来调用被启动 Activity 的 onResume() 这一生命周期方法

2. performLaunchActivity() 方法主要的逻辑

  1. 从 ActivityClientRecord 中获取待启动的 Activity 的组件信息
  2. 通过 Instrumentation 的 newActivity() 方法使用类加载器创建 Activity 对象
  3. 通过 LoadApk 的 makeApplication() 方法来尝试创建 Application 对象
  4. 创建 ContextImpl 对象并通过 Activity 的 attach() 方法来完成一些重要数据的初始化
  5. 调用 Activity 的 onCreate() 方法
-------------------- 本文结束感谢您的阅读 --------------------