安卓

app启动流程startactivity流程

2021-12-22  本文已影响0人  nich

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。

上一篇下一篇

猜你喜欢

热点阅读