点击应用图标-应用(Activity)的启动流程

一 前言

点击应用图标后会去启动应用的LauncherActivity,如果LancerActivity所在的进程没有创建,还会创建新进程,整体的流程就是一个Activity的启动流程。Activity的启动流程是面试常客,也是高级工程师所必须了解的,本篇不涉及到源码的解读 ,主要是清楚了解Activity的启动流程,要看源码分析可以看这篇文章
Activity的启动流程源码解析

二 Activity的启动流程

这里写图片描述

2.1 整个流程涉及的主要角色有:

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。

2.2 整个流程主要涉及四个进程:

  1. 调用者进程,如果是在桌面启动应用就是Launcher应用进程。
  2. ActivityManagerService等所在的System Server进程,该进程主要运行着系统服务组件。
  3. Zygote进程,该进程主要用来fork新进程。
  4. 新启动的应用进程,该进程就是用来承载应用运行的进程了,它也是应用的主线程(新创建的进程就是主线程),处理组件生命周期、界面绘制等相关事情。

2.3 整个流程如下

  1. 点击桌面应用图标,Launcher进程将启动Activity(MainActivity)的请求以Binder的方式发送给了AMS。
  2. AMS接收到启动请求后,交付ActivityStarter处理Intent和Flag等信息,然后再交给ActivityStackSupervisior/ActivityStack处理Activity进栈相关流程。同时以Socket方式请求Zygote进程fork新进程。
  3. Zygote接收到新进程创建请求后fork出新进程。
  4. 在新进程里创建ActivityThread对象,新创建的进程就是应用的主线程,在主线程里开启Looper消息循环,开始处理创建Activity。ActivityThread利用ClassLoader去加载Activity、创建Activity实例,并回调Activity的onCreate()方法。这样便完成了Activity的启动。

猜你喜欢

转载自blog.csdn.net/zhangqilugrubby/article/details/80144589