Activity启动过程以及面试回答 - kylodw/android_knowledge GitHub Wiki
面试回答:
Activity的启动过程:我们从Context的startActivity说起,其实现是ContextImp
l的startActivity,然后内部会通过Instrumentation
来尝试启动Activity,这是一个跨进程
过程,它会调用AMS
的startActivity,当AMS校验完Activity的合法性后,会通过ApplicationThread
回调到我们的进程,这也是一次跨进程
过程,而ApplicationThread就是一个Binder。回调逻辑是在Binder线程中完成的,所以需要通过Handler(H)将其切回UI线程,第一个消息是LAUNCH_ACTIVITY,它对应着handleLaunchActivity,在这个方法里面完成了Activity的创建和启动,接着在Activity的onResume中,Activity的内容将开始渲染到Window上面,然后开始绘制直到我们可见。
Activity启动过程
- startActivity ->
- startActivityForResult->
mMainThread.getApplicationThread(),它的类型是ApplicationThread,ApplicationThread是ActivityThread的一个内部类
- Instrumentation.ActivityResult.execStartActivity()->
ActivityManagerService
继承自ActivityManagerNative
,而ActivityManagerNative
继承自binder
并实现了IActivityManager
这个Binder接口,因此AMS也是一个binder,它是IActivityManager
的具体实现
- ActivityManagerNative.getDefault().startActivity()->
ActivityManagerNative.getDefault()会通过create创建AMS这个Binder对象(
AMP-->AMS
这是一次binder通信过程)
- AMS启动Activity:startActivity
ActivityStackSupervisor
.startActivityMayWait()->ActivityStackSupervisor
.startActivityLockedActivityStackSupervisor
.startActivityUncheckedLocked
由ActivityStackSupervisor转移到ActivityStack
ActivtyStack
.resumeTopActivitiesLockedActivtyStack
.resumeTopActivityInnerLocked()ActivityStackSupervisor
.startSpecificActivityLocked()ActivityStackSupervisor
.realStartActivityLocked()
app.thread的类型是IApplicationThread,IApplicationThread是一个Binder类型的接口,实现者是ActivityThread的内部类ApplicationThread。ApplicationThread继承了ApplicationThreadNative,而ApplicationThreadNative继承了Binder并实现了IApplicationThread接口。(
ApplicationThreadProxy-->ApplicationThread
这也是一次Binder通信过程)
- app.thread.scheduleLaunchActivity()
回到ApplicationThread中
- ApplicationThread.scheduleLaunchActivity()
- 发送一个启动Actiivty的消息给Handler处理(H),sendMessage(H.LAUNCH_ACTIVITY,r)
- Handler(H)对消息进行处理LAUNCH_ACTIVITY
- ActivityThread.handleLaunchActivity()
performLaunchActivity(r,customIntent)主要完成了这几件事: 1, 从ActivityClientRecord中获取�待启动Activity的组件信息 2,通过Instrumentation的newActivity方法使用类加载器创建Activity对象 3,通过LoadedApk的makeApplication方法来尝试创建Application对象,Application对象创建完毕,系统会通过Instrumentation的callApplicationOnCreate来调用Application的onCreate方法。 4,创建ContextImpl对象并通过Activity的attach方法来完成重要数据的初始化 5,调用Activity的onCreate方法
- performLaunchActivity()完成对Activity对象的创建和启动
- ActivityThread.handleResumeActivity()启动Activity的onResume()生命周期方法