今天就介绍ActivityThread启动之后,是如何启动 Application (基于Android 8.0 系统)。
源码分析
ActivityThread初始化:实例化ActivityThread & 创建主线程Handler与Looper接收信息
ActivityThread的attach函数:获取ActivityManagerService的代理对象;通过代理对象调用attachApplication(),获取启动application所需信息(应用进程相关数据)
在android当中的binder通信机制,那么实际上我们的ActivityManager是有系统服务所调用管理,并且通过在binder接口当中进行调用,这也是为什么我们讲Activity是跨进程访问的原因,在这里获取AMS ,调用方法 attachApplication()
ActivityManagerService的attachApplication函数:
在这里面调用attachApplicationLocked()通知ActivityThread启动application(IApplicationThread是ActivityThread的内部类,负责与ActivityManagerService通讯);
在这个方法的后面 sendMessage(H.BIND_APPLICATION, data);
在H 的Hander中handlerMessage中在该message的处理如图:
ActivityThread的handleBindApplication函数:
AMS中调用了ActivityThread的bindApplication函数,其内部其实是完成了Handler切换到主线程,并且最后活调用handleBindApplication(),下面我们看看其内部源码;
一下是这个方法的部分代码片段:
.类关系
ActivityThread:通过IActivityManager类,通知AMS准备application启动所需进程数据 ;
ActivityManagerService:获取application启动所需进程数据 ;
Instrumentation:创建&启动Application;跟踪Application的生命周期
Application启动过程的时序图