(基于android7.0)
根Activity启动(Launcher启动)大致分为三个部分:
- Launcher->AMS
- AMS->ApplicationThread
- 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()。
网友评论