Activity是一个组件,组件的启动是要通过AMS的,和Application的启动一样,Activity的启动也会涉及到AMS、Zygote以及应用进程之间的socket通信以及Binder调用。
上图就是Activity组件启动的流程,当我们通过startActivity启动一个Activity组件的时候,系统首先会向AMS发起调用,AMS会首先检查当前Activity组件所在的应用进程是否已经被启动。
要是应用进程没有启动:
要是应用进程已经启动,就是有上面的6,AMS直接通过应用的Binder调用,调用应用进程创建Activity组件。
上面的跨进程通信的过程中,除了AMS和Zygote的通信方式是本地socket,其他的跨进程通信都是通过Binder机制完成的。
AMS在通过Binder调用,调用应用进程启动Activity组件的过程中:
1. 首先应用进程会通过ClassLoader加载对应的class字节码文件;
2. 通过newInstance创建一个Activity的实例,此步调用了Activity的构造函数;
3. 创建一个ContextImpl对象实例,通过Activity实例的attachBaseContext复制到ContextWrap的mBase(mBase是context的服务托管,所有对Activity的Context的调用,实际上都是通过mBase来完成的);
4. 经历上面的流程之后,就会调用Activity实例的生命周期onCreate、onResume、onStart