启动一个app的流程:
1、Launcher中开启一个app —>
2、Activity.startActivityForResult —>
3、整个进程只会存在一个Instrumentation对象,每个Activity都会持有Instrumentation对象的引用,mInstrumentation.execStartActivity() —>
4、ActivityManagerNative.getDefault() —>
5、返回一个ActivityManagerProxy对象, ActivityManagerProxy.startActivity(),这个方法里面做的事情就是IPC通信,利用Binder对象,调动transact(),把所有需要的参数封装成Parcel对象,向AMS发送数据进行通信。—>
6、ActivityManagerService.startActivity() —>
7、ActivityManagerService.startActivityAsUser() —>
8、出现一个新对象ActivityStackSupervisor,通过这个类实现对ActivityStack的部分操作,ActivityStackSupervisor.startActivityMayWait() —>
9、startActivityLocked() —>
10、调用startActivityUncheckedLocked(),此时要启动的Activity已经通过校验,被认为是一个正当的启动请求。—>
11、终于在这里调用了ActivityStack 的 startActivityLocked(ActivityRecord r,
boolean newTask,boolean doResume, boolean keepCurTransition,
Bundle options)。
ActivityRecord 代表的就是要开启的 Activity 对象,里面分装了很多信息,比
如所在的 ActivityTask 等,如果这是首次打开应用,那么这个 Activity 会被放
到 ActivityTask 的栈顶,—>
12、mStackSupervisor.resumeTopActivitiesLocked —>
13、ActivityStack .resumeTopActivityInnerLocked —>
14、startPausingLocked() —>
15、prev.app.thread.schedulePauseActivity(),到Lancher进程暂停指定Activity —>
16、ActivityThread.handlePauseActivity() —>
17、ActivityThread.performPauseActivity(),暂停指定Activity —>
18、接着通过Bindler通信,通知AMS已经完成暂停的操作
ActivityManagerNative.getDefault().activityPaused(token)。