Activity启动过程以及面试回答 - kylodw/android_knowledge GitHub Wiki

面试回答:

Activity的启动过程:我们从Context的startActivity说起,其实现是ContextImpl的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.startActivityLocked
  • ActivityStackSupervisor.startActivityUncheckedLocked

由ActivityStackSupervisor转移到ActivityStack

  • ActivtyStack.resumeTopActivitiesLocked
  • ActivtyStack.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()生命周期方法