Activity启动流程解析

(基于android7.0)

根Activity启动(Launcher启动)大致分为三个部分:

  1. Launcher->AMS
  2. AMS->ApplicationThread
  3. ActivityThread->Activity
Launcher->AMS
  • Launcher.startActivitySafely()
  • 内部添加了flag,new_task,然后调用startActivity()->startActivityForResult()
  • 内部调用了Instrumentation.execStartActivity(),接着调用了ActivityTaskManager.getService().startActivity()
  • 这个ActivityTaskManager.getService()是IActivityTaskManager,是AMS的Binder代理对象。
  • 此时已经进入AMS的流程。
AMS->ApplicationThread

具体涉及:AMS->ActivityStarter->ActivityStackSupervisor->ActivityStack->ActivityStackSupervisor->ApplicationThread。

  • AMS的startActivity()->startActivityAsUser(),此时拿到UserId。
    接着调用ActivityStarter的startActivityMayWait()->startActivityLocked()->startActivityUnChecked(),这里创建了新的TaskRecord,用来描述一个Activity的任务栈,即创建了新的任务栈。内部还创建ActivityRecord,封装了Activity的参数,如intent。
  • 接着调用ActivityStackSupervisor的resumeFocusedStackTopActivityLocked()
  • 该方法内部调用了ActivityStack的resumeTopActivityUnCheckedLocked()->resumeTopActivityInnerLocked()
  • 然后调用了ActivitySupervisor的startSpecificActivityLocked(),内部判断app进程是否存在,存在则调用realStartActivityLocked(),不存在则调用AMS的startProcessLocked(),通知Zygote进程开启app进程。
  • 在realStartActivityLocked()中调用了app.thread.scheduleLaunchActivity(),此时app.thread即为ApplicationThread。
ApplicationThread->Activity

具体涉及:ApplicationThread->ActivityThread->H->Instrumentation->Activity

  • 在ApplicationThread的scheduleLaunchActivity()中,创建了ActivityClientRecord,用于封装Activity的参数,然后向H发送LAUNCH_ACTIVITY消息。
  • H是主线程的Handler消息管理类,由于ApplicationThread是Binder,运行在Binder线程中,这里使用H来切换线程到主线程中。收到消息后执行了handleLaunchActivity()。
  • 内部调用了performLaunchActivity(),handleResumeActivity()。
  • 关键点performLaunchActivity(),内部创建了ContextImpl、使用ClassLoader创建了Activity、初始化Activity(调用activity的attach方法),然后调用了Instrumentation的callActivityOnCreate()->Activity的performCreate(),内部会走到Activity的OnCreate()。

你可能感兴趣的:(Activity启动流程解析)