Launcher本身就是一个应用程序,我们启动app时的本质是对Launcher这个app进行操作。Launcher接收到点击事件时调用startActivity方法,进行activity的跳转。但是与我们平时开发app有所不同,我们要启动的Activity所在的app运行在另外一个进程中,这就涉及到跨进程通信(IPC,Inter-Process Communication)。
Android中通过ActivityManagerService来实现和管理IPC,但是它不能直接让开发者接触到,而是用ActivityManager,WifiManager,LocationManager,WindowsManager等作为入口。我们这里用到的是ActivityManager。
一、应用启动流程 (启动分为冷启动、温启动、热启动)
1、Launcher所在进程通过binder发送消息给AMS进程
Lanucher -> startActivity -> instrumentation -> AMN/AMP(binder) -> AMS
2、AMS收到消息,保存要开启的应用信息.(action category cmp等),AMS发送消息告诉Launcher我已收到消息,你可以停止了
action = "android.intent.action.MAIN"
category = "android.intent.category.LAUNCHER"
cmp = “com.xx.xx.ui.activity.MainActivity”
3、Launcher停止,告诉AMS已处于Paused状态。
4、AMS判断目标应用进程是否存在,如果已存在,直接唤醒(热启动)。如果不存在,启动应用(冷启动)。
新建应用过程:
Fork zygote进程 -> 新建ActivityThread ->执行Main方法 (加载app的classes到内存中、Looper、Application初始化)
5、应用Binder通知AMS我已启动
6、AMS将保持的cmp等信息发送给应用 -> Ams(ApplicationThreadProxy) -> ApplicationThread -> ActivityThread ->H -> handleLanucherActivity
二、Activity启动
- Instrumentation: 监控应用与系统相关的交互行为。
- AMS:组件管理调度中心,什么都不干,但是什么都管。
- ActivityStarter:Activity启动的控制器,处理Intent与Flag对Activity启动的影响,具体说来有:1 寻找符合启动条件的Activity,如果有多个,让用户选择;2 校验启动参数的合法性;3 返回int参数,代表Activity是否启动成功。
- ActivityStackSupervisior:这个类的作用你从它的名字就可以看出来,它用来管理任务栈。
- ActivityStack:用来管理任务栈里的Activity。
- ActivityThread:最终干活的人,Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。
注:这里单独提一下ActivityStackSupervisior,这是高版本才有的类,它用来管理多个ActivityStack,早期的版本只有一个ActivityStack对应着手机屏幕,后来高版本支持多屏以后,就有了多个ActivityStack,于是就引入了ActivityStackSupervisior用来管理多个ActivityStack。
三、Binder
应用给AMS发消息
AMN/AMP(binder) -> AMS
AMS给应用发消息
ActivityRecord(ApplicationThreadProxy) -> ApplicationThread
参考:
https://www.jianshu.com/p/94a929b66d9d