关于Activity的启动过程

来源:互联网 发布:淘宝哪家种子靠谱 编辑:程序博客网 时间:2024/06/13 20:31

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完成整个启动过程。
0 0
原创粉丝点击