启动流程
1.普通Activity启动
普通Activity的启动就是通过调用startActivity方法启动一个新的Activity,总体流程如下图:
其中涉及到了两个进程,一个是App进程和AMS进程。整体的步骤是:
1.启动者Activity向Instrumentation请求启动目标的Activity。
2. Instrumentation通过AMS在App进程的IBinder接口(IActivityManager)访问AMS,此时App进程会阻塞等待AMS的调用返回,采用的跨进程通信技术是AIDL。
3.AMS会进行一系列的验证工作,如判断目标Activity实例是否存在、启动模式是什么、有没有在AndroidManifest中注册等等。
4.当AMS验证结束后会通过ClinentLifeCycleManager发送事物给App进程,利用App进程在AMS进程的IBinder接口(IApplicationThread)访问App进程ApplicationThread,采用的跨进程通信方式是AIDL。
5.ApplicationThread是ActivityThread的内部类,当ApplicationThread接受到来自AMS的事务后,会将事务直接转交给ActivityThread处理。
6.ActivityThread通过Instrumentation利用类加载器(反射)进行实例的创建,同时利用Instrumentation回调目标Activity的生命周期。
介绍几个关键的类:
Instrumentation:Instrumentation 是 Activity 与外界联系的类(不是 Activity 本身的类都统称为外界)。目标 Activity 通过 Instrumentation 来请求启动,ActivityThread 通过 Instrumentation 来创建 Activity 和回调 Activity 的生命周期。
ActivityThread:每个应用程序只有一个唯一实例,负责对 Activity 创建的管理。ActivityThread 的内部类 ApplicationThread 只负责 App 进程和 AMS 进程的通信,将来自 AMS 的事务交给 ActivityThread 处理。
AMS,全称 ActivityManagerService,系统级服务,负责管理四大组件。
2.根Actvity的启动
根Actvity就是我们点击手机桌面图标时,应用程序启动的第一个Activity。启动根Activity的流程其实和启动普通Activity的流程类似,只是启动根Activity时需要新建一个App进程。总体流程如下图:
其中涉及到四个进程分别是:Launcher进程、AMS进程、App进程、Zygote进程。
1.点击桌面图标后,Launcher进程访问AMS进程请求启动目标Activity,采用的跨进程方式是AIDL。
2 AMS进程访问Zygote进程请求启动一个新的进程。采用的跨进程方式是Socket。
3 Zygote进程通过调用fork函数创建一个App进程。
4 App进程创建完成后,App进程访问AMS进程进行通知,采用的跨进程方式是AIDL。
5 AMS进程收到来自App进程的通知后,将启动Activity的操作封装成事务,并将封装好的事务发送给App进程。
6 App进程接受到来自AMS进程的事务后,根据事务创建目标Activity,并回调目标Activity的生命周期。
本文主要是用来记录自己的学习笔记,看原文请移步:Activity 启动流程