Android

关于Activity的启动过程

2017-08-10  本文已影响0人  铜角大王

1.startActivity有好几种重载,但它们最终都会调用startActivityForResult方法。

2.启动Activity真正的实现由ActivityManagerNative.getDefault的startActivity方法来完成。由于ActivityManagerNative.getDefault是一个IActivityManager

类型的Binder对象,而ActivityManagerService(简称AMS)继承自ActivityManagerNative,ActivityManagerNative又继承自Binder并实现了IActivityManger这个Binder接口,所以ActivityManagerNative.getDefault的具体实现是AMS。AMS中的Binder对象采用单例模式对外提供。

3.最后在ActivityStackSupervisor中的realStartActivityLocked方法中调用了app.thread.scheduleLaunchActivity()方法。其中app.thread的类型为IApplicationThread,IApplicationThread继承自IInterface,并在声明了一系列启动、停止Activity和Service的方法。

4.IApplicationThread的具体实现为ActivityThread中的内部类ApplicationThread。ApplicationThread继承自ApplicationThreadNative,而ApplicationThreadNative继承自Binder并实现了IApplicationThread接口。

5.所以最终Activity的启动过程回到了ApplicationThread中,ApplicationThread通过scheduleLaunchActivity方法来启动Activity。

6.scheduleLaunchActivity的实现很简单,发送一个启动Activity的消息给一个名叫H的Handler处理,Handler又调用了ActivityThread的handleLanuchActivity方法来实现,handleLanuchActivity又最终调用了performLanuchActivity方法。

7.performLaunchActivity主要完成了下面几件事:

从ActivityClientRecord中获取待启动的Activity的组件信息、

通过Instrumentation的newActivity方法使用类加载器创建Activity对象、

通过LoadedApk的makeApplication方法来尝试创建Application对象(如果创建过就不再创建,所以一个应用只有一个Application对象)、

创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化,并跟Activity建立关联(ContextImpl是Context的具体实现),在attach方法中Activity还会完成Window的创建并建立自己和Window的关联,这样当Window接收到外部输入事件后就可以将事件传递给Activity。

8.mInstrumentation.callActivityOnCreate(),这样Activity的onCreate被调用,Activity完成整个启动过程。

上一篇下一篇

猜你喜欢

热点阅读