Android-AMS(三)-startActivity流程分析
作者:互联网
- app进程通过ActivityManager.getService (高版本)或者 ActivityManagerNative.getDefault(低版本)返回的IActivityManager来调用系统进程AMS中的方法。该IActivityManager是AMS在app进程的binder代理对象
- 同样,系统进程通过ProcessRecord.IApplicationThread调用app进程相关方法。IApplicationThread是系统进程持有的app进程中ApplicationThread的Binder代理对象。
- AMS通过binder代理调用到ApplicationThread(ActivityThread的内部类)中的方法后,通过主线程(ActivityThread中的main方法)中开启的handler消息轮询来通知主线程调用相关方法。主线程的相关声明周期方法的具体实现会委托给Instrumentation类实现,在Instrumentation类中,会调用具体组件的相关生命周期方法。
- 这里主要分析从Instrumentation.execStartActivity()开始,前面的流程就不在这里提了。很基础的东西。这里主要是从Instrumentation.execStartActivity()开始。
execStartActivity的代码如下,应用程序在调用startActivity时都会走到这里,这里就会调用AMS的startActivityAsUser()方法启动Activity
AMS的startActivityAsUser()会调用到ActivityStarter.startActivityMayWait(). 在AMS里面。其实Activity的启动是在ActivityStarter里面完成的。
startActivityMayWait()很长,我们找到关键部分,代码如下
跟踪startActivityLocked()。我们发现它调用了startActivity(),代码如下:
这里的startActivity()有重载,最终会走到这个startActivity() 这里调用了startActivityUnchecked(),代码如下:
跟进startActivityUnchecked()里面,其实到这里才开始真正意义上的启动一个Activity.代码如下,启动一个Activity主要的做了三件事:
- 根据Activity的四种启动模式和启动标志位来决定如何启动Activity
- 启动Activity,并调用Activity的生命周期,并使其获得焦点事件
- 通知Activity,有一个Intent试图启动它
跟resumeFocusedStackTopActivityLocked()发现期调用了resumeTopActivityUncheckedLocked(),继续跟踪该方法。发现调用了resumeTopActivityInnerLocked(),还是跟。发现其调用了mStackSupervisor.startSpecificActivityLocked()。跟到这里。代码如下:
这里开始准备调用Zygote去创建新进程了,创建进程的流程,这里不在跟踪,有兴趣的可以自行了解。如果想看这一块的内容,请移步到Android 进程创建流程分析跟Android系统启动流程分析。这里不在做过多介绍。我们移步到进程创建之后的流程里。这里我们用时序图做一下简要交代,调用Activity最终会调用到scheduledLaunchActivity()。时序图如下:
上图第九步后面的流程。由于时间关系。不在跟踪,我已经整理成xmind文档,有兴趣了解的可以自行跟踪。xmind文档如下:
标签:调用,这里,startActivity,Activity,进程,Android,AMS 来源: https://www.cnblogs.com/gwm-Android/p/16178552.html