Activity启动流程分析

118 阅读1分钟

Activity启动流程

Activity启动流程分为根Activity的启动流程与普通Activity的启动流程,因普通Activity与根Activity启动过程有重合的部分,所以以下主要分析根Activity的启动过程,也可以说是APP的启动过程。

启动根Activity需要涉及4个进程的相互配合,分别是Launcher,AMS,Zygote和APP这4个进程。第一步点击桌面的APP快捷图标后 Lancher进程会请求AMS,第二步是ASM到ApplicationThread的回调过程,第三步是ActivityThread启动Activity的过程。

接下来根据源码来详细分解这三个主要的步骤:

点击桌面的APP快捷图标后 ,

Launcher 进程会调用StartActivitySafely() --->

①Activity的startActivity()->Activity的startActivityForResult()->Instrumentation的execStartActivity()方法,接下来会通过Binder调用到SystemServer进程的

②ActivityTaskManagerService的StartActivity->ActivityTaskManagerService的StartActivityAsUser->

③SystemServer进程的ActivityStater 的execute()->ActivityStater 的StartActivity->ActivityStater 的StartActivityUnChecked()->ActivityStack的resumeTopActivityUncheckedLock()->ActivityStack的resumeTopActivityInnerLocked->

④SystemServer进程的ActivityStackSuperVisor的startSpecificActivityLocked,此处会判断APP进程是否存在,不存在向AMS请求创建APP进程,AMS请求Zygote fork APP进程,创建Binder线程池,使用反射获取到ActivityThread并执行Main方法,走ActivityThread 的attach()方法,然后调用AMS的 attachApplication()->attachApplicationLocked() 内部调用ApplicationThread的BindApplication方法,通过makeActive方法赋值IApplicationThread创建进程后赋值,然后App进程就存在了

⑤如果存在就调用SystemServer进程的ActivityStackSuperVisor的realStartActivityLocked(),内部通过Binder调用了ActivityThread的内部类ApplicationThread的scheduleTransaction然后调用ActivityThread的scheduleTransaction,然后通过Handler切换到主线程并通过TransactionExcutor在ActivityThread中回调handleLaunchActivity,performLaunchActivity,创建了Activity实例并且创建Application对象调用Application的onCreate(),继续调用Activity的onCreate(),然后ActivityThread的handleResumeActivity回调,调用生命中周期方法onStart(),onResume()。

a.jpg