Activity启动过程——10.0源码分析

Posted 哈特谢普苏特

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity启动过程——10.0源码分析相关的知识,希望对你有一定的参考价值。

对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程。

在windows系统看,看源码可以通过源码阅读 这个网址查看(AOSPXRef),也可以直接下载整个源码,在Soure Insight中查看

对于activity而言,无论继承的是AppCompatActivity还是其他,最终它的基类是Activity,调用startActivity()启动新的activity,实际上还是要调用startActivityForResult()方法。

 调用startActivityForResult()方法启动一个新的activity,需要调用Instrumentation的execStartActivity()方法

 我们去看Instrumentation的execStartActivity()方法

 它在方法内部调用了

 ActivityTaskManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target, requestCode, 0, null, options);

因此我们需要知道 ActivityTaskManager.getService()获取的是什么东西

 从上图中可以看出在activity的创建过程中,涉及到了进程间的通信(Binder),同时返回的是一个 IActivityTaskManager.Stub.asInterface(b)的内容,点击查看发现其实是一堆看不懂的东西,留意一下startActivity的第一个参数是IApplicationThread类型的caller。

 因为IActivityTaskManager实际上是一个接口,因此我们需要寻找实现IActivityTaskManager的类,实际上是ActivityTaskManagerService(注意 类似于源码的这种 实现类往往是后面加个Service)

 继续在ActivityTaskManagerService中寻找startActivity()方法

 发现startActivity中内部调用 了startActivityAsUser()方法,注意第一个参数依旧是IApplicationThread类型的caller。去查看startActivityAsUser()方法

发现 startActivityAsUser()进行了重载,看上图红色部分,用来建造者模式,去寻找getActivityStartController() .obtainStarter是什么,以及执行的execute()方法是什么

 实际上是ActivityStartController类型

 通过obtainStarter()方法,最终获得的是ActivityStarter类型的内容,从而用于执行execute()方法

 去跟踪ActivityStarter的execute()方法

 发现会调用sartActivityMayWait()方法或startActivity()方法,sartActivityMayWait()这个方法有点长,截取了关键一段,最终发现还是会调用startActivity()方法。注意现在的第一个参数其实还是上文提到的IApplicaiton类型的caller。

 去查看startActivity()方法,发现startActivity()方法进行了多次重载

 在最终的startActivity()中,调用了startActivityUnchecked()方法

 继续跟踪startActivityUnchecked()方法,发现里面调用mRootActivityContainer .resumeFocusedStacksTopActivities(),而且我们也看到了在activity启动模式中常见的flag(这个不是这篇文章的重点)

 去跟踪mRootActivityContainer.resumeFocusedStacksTopActivities()方法,也就是RootActivityContainer类中的方法

发现又进行了重载,里面调用了focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions)

 

 

 这个focusedStack实际上是ActivityStack(管理activity活动的),去查看里面的resumeTopActivityUncheckedLocked()方法

 继续查看resumeTopActivityInnerLocked()方法,发现最终执行了 mStackSupervisor.startSpecificActivityLocked()方法

 mStackSupervisor实际上是ActivityStackSupervisor,继续查看

 发现调用了realStartActivityLocked()方法,这个方法内容很多

 

 

 mservice实际上是上文中的ActivityTaskManagerService(转了一圈终于要回来了),可以留意一下clientTransaction中addCallback,添加了一个名为LaunchActivityItem的回调。

 获取到的getLifecycleManager实际上是ClientLifecycleManager

 去查看ClientLifecycleManager中的scheduleTransaction()方法

实际上调用了参数本身的schedule()方法, 这个transaction实际上就是realStartActivityLocked()方法中的clientTransaction,先去看ClientTransaction的schdule()方法

发现它调用了mClient.scheduleTransaction(),并把自己传了进去

这个mClient又是什么?

 其实就是我们上文一直在说的IApplicaionThread,现在去IApplicaionThread中,发现是个.aidl类型的文件,我们去找它的子类ApplicationThread.发现ApplicationThread是ActivityThread的内部类

 跟踪上面的scheduleTransaction()方法

 发现调用了ActivityThread自身的scheduleTransaction()方法

感觉好像找不到了。。。

ActivityThread继承了ClientTransactionHandler类,去查看该类

 感觉离真相越来越近了,发现ClientTransactionHandler类中的scheduleTransaction()方法实际上调用了sendMessage(),实际上ClientTransactionHandler就是一个handler。我们已经知道消息的what是EXECUTE_TRANSACTION,再去ActivityThread中进行查找

 在handleMessage()中发现了实际上调用了mTransactionExecutor.execute(transaction);

mTransactionExecutor显而易见是个线程池

 在线程池mTransactionExecutor的execute()方法中调用了​ executeCallbacks(transaction);

 继续查看​ executeCallbacks(transaction)方法

发现内部调用了item的execute方法,这个item实际上就是 上文中在执行realStartActivityLocked()时添加的LaunchActivityItem,查看LaunchActivityItem里面的execute()方法

 调用了client的handleLaunchActivity()方法,逐渐熟悉起来。。。

这个client是参数ClientTransactionHanlder,实际上就是ActivityThread,回到ActivityThread中查看handleLaunchActivity()方法

调用了熟悉的performLaunchActivity()方法

 

 又需要用到Instrumentation的callActivityOnCreate()方法了

 很熟悉的配方,调用activity自身的performCreate()方法

 

最终看到调用了Activity中的onCreate()方法,也就是说一个activity被启动了,这就是安卓10 activity启动的大致流程,里面还有很多细节值得我们探讨。

以上是关于Activity启动过程——10.0源码分析的主要内容,如果未能解决你的问题,请参考以下文章

基于android10.0源码分析Activity的启动流程

基于android10.0源码分析Activity的启动流程

基于android10.0源码分析Activity的启动流程

Android 启动过程Activity 启动源码分析 ( Activity -> AMS主线程阶段 )

Android 启动过程Activity 启动源码分析 ( ActivityThread 流程分析 二 )

Android 启动过程Activity 启动源码分析 ( AMS -> ActivityThreadAMS 线程阶段 )