概述
activity启动流程整体如图所示
整个过程涉及到的主要类名已经在图中标红显示了,中间还有一些没标红但同样很重要的类,这些类咱们都会通过代码逐一分析其在Activity启动中的作用。
启动activity后实际上是Instrumentation对象(顺便提一句,咱们重写Activity生命周期的回调方法就是通过这个对象来调用的)来执行execStartActivity操作,如下图所示:
那么这个Instrumentation对象是怎么来的呢?看源码:
上面代码中的data.instrumentationName其实就是ComponentName,怎么样,是不是很熟悉,每次你在启动跳转Activity的时候传给Intent的参数里面就有这个。
接着往下走,Instrumentation对象调用了execStartActivity,在这个函数中,其实instrument对象是通过ActivityTaskManager类获取了IActivityTaskManager对象(具体实现类是ActivityTaskManagerService)并调用了它的startActivity方法,该方法中传递的参数whoThread其实就是一个IApplicationThread对象,** IApplicationThread whoThread = (IApplicationThread) contextThread;
** ,它的实现类是ApplicationThreadProxy,其实就是AIDL编译相关生成的,这里会涉及到IBinder进程间通信。因为ActivityTaskManagerService本质是一个运行在系统进程上的Service。
接着走,在ActivityTaskManagerService的startActivity方法中是直接调用并返回这个startActivityAsUser函数,进入这个函数,可以看到先是检查了一下userId(包括你的包名注册信息、启动模式等),这个id其实就是你的ApplicationId,根据这个来区分管理不同的app的activity相关请求。可以看到,真正的调用其实是在 ...execute()
这个函数中,getActivityStartController这个函数返回的是一个ActivityStartController对象,在这个对象中维护了两个重要的对象:
private final ActivityTaskManagerService mService;
private final ActivityStackSupervisor mSupervisor;
当然还要其他的比如ActivityRecord对象(记录activity)以及一些启动列表。本文重点是上面两个对象,第一个其实之前已经介绍了,重点看下第二个,第二个其实在第一张图的最右边可以看到,ActivityStackSupervisor对象的相关内容放到后面再说。直接进入excute函数看看都做了些什么。
从execute方法一路跟踪进去,最后定位到ActivityStarter中的startActivity函数,第一行就可以看到调用了ActivityStackSupervisor对象来通知Activity正在启动。
一路跟踪下来,中间经过了非常多的检查(多是由ActivityStackSupervisor对象进行)和设置(启动模式就是这个时候设置的),来到了下图代码:
从名字就可以看出来,这是调用了Activity栈的启动方法,点进去看看:
继续跟踪下去,最后发现来到了ActivityStackSupervisor对象里面的startSpecificActivityLocked方法,如图所示:
接着继续调用了ActivityStackSupervisor中的realStartActivityLocked方法,在这个方法中我们发现了两个有意思的地方:
第一处是将activity的启动回调注册到一个ClientTransaction对象中,并在第二处将这个transaction对象注册到schedule中,定时执行刚刚注册进去的回调,具体是如下图中的方法:
该方法中的client对象就是从IApplicationThread中传过来的ActivityThread对象:
在这个方法中,回调用performLaunchActivity函数:
在该方法中,会先调用instrument的newActivity方法创建Activity对象,
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
接着执行attach方法:
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.configCallback,
r.assistToken);
改方法会绑定context,创建PhoneWindow对象并关联到WMS,
接着便是耳熟能详的onCreate方法了。
至此,Activity便是基本启动完成了!
最后
以上就是务实宝贝为你收集整理的Activity启动流程分析——基于API 29的全部内容,希望文章能够帮你解决Activity启动流程分析——基于API 29所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复