💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ## Activity的启动流程 ![](https://img.kancloud.cn/99/b0/99b0aa24e3c9fa2c6dd6751cab906574_1344x1280.png) ### 整个流程涉及的主要角色有: * Instrumentation: 监控应用与系统相关的交互行为。 * ActivityManagerService(AMS):组件管理调度中心,什么都不干,但是什么都管。 * ActivityStarter:Activity启动的控制器,处理Intent与Flag对Activity启动的影响,具体说来有:1 寻找符合启动条件的Activity,如果有多个,让用户选择;2 校验启动参数的合法性;3 返回int参数,代表Activity是否启动成功。 * ActivityStackSupervisior:这个类的作用你从它的名字就可以看出来,它用来管理任务栈。 * ActivityStack:用来管理任务栈里的Activity。 * ActivityThread:在Android中它就代表了Android的主线程,注意是代表而不是说它就是一个Thread类,它是创建完新进程之后(肯定是在 * 一个线程中啊),main函数被加载,然后执行一个loop的循环使当前线程进入消息循环,并且作为主线程。 * ApplicationThread:最终干活的人,是ActivityThread的内部类,也是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端的请求然后进行处理,最大的client就是AMS.Activity、Service、BroadcastReceiver的启动、切换、调度等各种操作都在这个类里完成。 注意:这里单独提一下ActivityStackSupervisior,这是高版本才有的类,它用来管理多个ActivityStack,早期的版本只有一个ActivityStack对应着手机屏幕,后来高版本支持多屏以后,就有了多个ActivityStack,于是就引入了ActivityStackSupervisior用来管理多个ActivityStack。 ### 整个流程主要涉及四个进程: * 调用者进程,如果是在桌面启动应用就是Launcher应用进程。 * ActivityManagerService等所在的System Server进程,该进程主要运行着系统服务组件。 * Zygote进程,该进程主要用来fork新进程。 * 新启动的应用进程,该进程就是用来承载应用运行的进程了,它也是应用的主线程(新创建的进程就是主线程),处理组件生命周期、界面绘制等相关事情。 ### 整个流程如下 点击桌面应用图标,Launcher进程将启动Activity(MainActivity)的请求以Binder的方式发送给了AMS。 AMS接收到启动请求后,交付ActivityStarter处理Intent和Flag等信息,然后再交给ActivityStackSupervisior/ActivityStack处理Activity进栈相关流程。同时以Socket方式请求Zygote进程fork新进程。 Zygote接收到新进程创建请求后fork出新进程。 在新进程里创建ActivityThread对象,新创建的进程就是应用的主线程,在主线程里开启Looper消息循环,开始处理创建Activity。ActivityThread利用ClassLoader去加载Activity、创建Activity实例,并回调Activity的onCreate()方法。这样便完成了Activity的启动。 ## 参考资料 [点击应用图标-应用(Activity)的启动流程](https://blog.csdn.net/zhangqiluGrubby/article/details/80144589) [一张图弄清Activity的启动过程](https://juejin.cn/post/6844903790953381896)