type
status
date
slug
summary
tags
category
icon
password
在分析源码之前,先想一下大概有哪些疑问:
- Activity是如何加载的?
- Activity为什么必须在Manifest文件中注册?
- Activity的本质是什么,可以不需要Activity实现Android APP吗?
- Activity的生命周期是如何调度的?
- Activity的启动模式的原理
源码中常见的类
- ActivityRecord
表示一个Activity,与Activity是一一对应的关系
- ActivityStack
即Activity栈,管理Activity的状态
- RootActivityContainer
一个暂时分离出来的类,主要就是一些不应该放到ActivityStackSuperVisor中的功能,可能后面会合并到RootWindowContainer中
Binder调用前
由于之前分析过一些代码的调用流程,这里从
ActivityStackSupervisor#startSpecificActivityLocked()
开始:之前说过,创建APP进程的时候走的是下面那个逻辑,这里启动Activity的时候看
realStartActivityLocked
方法:看一下调度事务的代码:
ActivityThread.ApplicationThread中的调度过程
现在进入了
ApplicationThread
中:ActivityThead
实现了ClientTransactionHandler
:这里的
mActivityCallback
即上面添加的LaunchActivityItem
,因此会先执行它的preExecute
方法:这里就是更新下信息,没什么大不了的,看来还是分析下面的这一句比较重要:
在
ActivityThread.H
中有:继续看:
这下思路清晰了:
- 先执行
LaunchActivityItem
中的execute
和postExecute
方法
- 再执行
ResumeActivityItem
中的execute
和postExecute
方法
Launch
看下
LaunchActivityItem
的指令:这下进入到了
ActivityThread
中的handleLaunchActivity
方法了:这下进入了启动Activity的核心实现代码了:
这里主要干了下面这几件事:
- 为目标Activity创建Context
- 使用ClassLoader加载Activity类并实例化
- 使用ClassLoader加载Application并实例化,调用attach()和onCreate()方法
- 执行Activity的attach() 方法并为Activity设置主题
- 使用Instrumentation执行Activity的onCreate()回调
Application和Activity代码的加载和实例化入口都在
Instrumentation
中:实例化其实都是反射调用:
Activity.onCreate()
至于Activity的onCreate()回调,也在
Instrumentation
中进行:到这里onCreate()回调就被调用了.
再来看下onResume()回调的调用吧
Activity.onResume()
还是回到之前的
ResumeActivityItem
中:还是Binder调用到ActivityThread中:
到这里Activity启动流程就分析完了.
总结
- 基于
ClientTransaction
的消息传递机制,通过Binder调用到ActivityThread中的方法
- ActivityThread中会使用
Instrumentation
和Handler
去执行各种逻辑
LoadedApk
和Instrumentaion
负责Application的创建和实例化
Instrumentation
负责Activity的创建和实例化
- Application和Activity的创建和实例化其实都是利用的Classloader和反射机制
- 四大组件的实例化代码都在
AppComponentFactory
中
- 作者:姜康
- 链接:https://jiangkang.tech/article/33ece598-db38-4b8e-88ad-220ad2b099ab
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。