app启动流程startactivity流程
app启动流程
binder发送信息到ams请求启动app,ams查询进程中是否有该app,若进程中没有app就会通过socket传递相关信息到zygote里面,fork出一个进程,然后通过新建activitythread进程,使用binder使信息和ams里面信息相关联
接下来看具体流程android11
frameworks/base/core/java/android/app/activity
主要看execstartactivity方法往下看看看
调用到了atms的startactivityasuser上,android各个版本的代码可能有点不一样。这里使用建造者模式新建ActivityStarter把信息存在里面调用execute()方法进去
然后主要看res = executeRequest(mRequest);
再进去
activityrecord是保存activity一些封装类
在看startactivityunchecked()-startActivityInner()-resumeFocusedStacksTopActivities-resumeTopActivityUncheckedLocked-resumeTopActivityInnerLocked-mStackSupervisor.startSpecificActivity(next, true, false)-realStartActivityLocked-
看mService.getLifecycleManager().scheduleTransaction(clientTransaction);
executecallbacks()方法进去看到ClientTransactionItem,是个抽象类,接下来看ClientTransactionItem实现LaunchActivityItem的execute方法,里面有个handlelaunchactivigty方法-final Activity a = performLaunchActivity(r, customIntent);
这里面有个makeapplication里面创建createAppContext,handleNewApplication,newApplication
-callActivityOnCreate最后跑跑跑performCreate到这里然后执行activity的oncreat方法
补充点app启动,和activity管理相关的一些数据结构
activityrecord:主要保存了activity相关信息里面有个比较关键的taskrecord
taskrecord:ArrayList<ActivityRecord> mActivities; //使用一个ArrayList来保存所有的 ActivityRecord ,TaskRecord中的mStack表示其所在的ActivityStack
ActivityStack:使用了一个ArrayList来保存TaskRecord。 另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。 ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理ActivityStack的
ActivityStackSupervisor:ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来管理不同的任务。 ActivityStackSupervisor内部包含了创建ActivityStack对象的方法。 AMS初始化时会创建一个ActivityStackSupervisor对象
简单关系图
一个ActivityRecord对应一个Activity,保存了一个Activity的所有信息;但是一个Activity可能会有多个ActivityRecord,因为Activity可以被多次启动,这个主要取决于其启动模式。一个TaskRecord由一个或者多个ActivityRecord组成,这就是我们常说的任务栈,具有后进先出的特点,ActivityStack则是用来管理TaskRecord的,包含了多个TaskRecord。