1.整体流程
启动一个应用,一般是通过桌面点击应用图标。桌面图标是由系统自带的一个叫Launcher的应用程序统一管理的,一般情况下,安装一个新的应用后,会在手机桌面上出现一个相应的图标。
启动一个APP会涉及到四个进程:
- Launcher进程
- SystemServer进程---AMS
- APP进程
- Zygote进程
因此一个APP启动过程,就是进程间相互通信的过程,整体的流程如下:
2.详细流程
1.Step1&Step2
Launcher的源代码工程在packages/apps/Launcher3 目录下
负责启动桌面图标的代码如下:
因为Luncher继承了 BaseDraggingActivity,代码如下:
指定了Flag为FLAG_ACTIVITY_NEW_TASK,表示在一个新的Task中启动,调用Activity的startActivity方法,通过查看该方法我们可以看到,最终调用了startActivityForResult方法,在该方法中又调用了Instrumentation的execStartActivity方法,Instrumentation类是用来监控应用程序和系统交互的类。
点击桌面图标Launcher进程处理结束,时序图如下:
2.AMS接受并处理启动请求,step3
调用ATMS的startActivity处理启动请求。
getActivityStartController()返回的是一个ActivityStartController对象,调用该class的obtainStarter方法,返回ActivityStarter对象,将该请求移交给ActivityStarter中的execute方法来处理。
在execute方法中,又调用了自身的executeRequest方法,主要检查权限是否合法,
调用startActivityUnchecked方法,大部分权限已检查通过,执行trace以及异常处理。
继续调用startActivityInner方法来处理,启动activity,并更新全局的Task堆栈信息。
在startActivityInner方法中,调用RootWindowContainer的resumeForcusedTasksTopActivities方法ÿ