由于Android系统内部对Activity做了封装,使得调用很方便,而且显式调用只要两行代码就能搞定:
Intent intent = new Intent(this, OtherActivity.class);
startActivity(intent);
尽管Activity内部的具体实现很复杂,但是掌握一个大概的流程还是必要的,具体如下:
1、startActivity有好几种重载方式,但是最终都会调用startActivityForResult()
startActivityForResult()内部调用Instrumentation的execStartActivity()
2、execStartActivity()调用ActivityManagerNative.getDefault().startActivity()
ActivityManagerNative继承Binder并实现了IActivityManager接口,而ActivityManagerService继承了ActivityManagerNative,所以ActivityManagerNative.getDefault()获取的就是ActivityManagerService对象,用来启动Activity。
3、startActivity()中调用ActivityStackSupervisor.startActivityWait()
startActivityWait()内部调用startActivityLocked()->startActivityLocked()->startActivityUncheckedLocked()->ActivityStack的resumeTopActivityLocked()
4、resumeTopActivityLocked()调用resumeTopActivityInnerLocked()
内部调用ActivityStackSupervisor的startSpecificActivityLocked(),startSpecificActivityLocked()内部调用realStartActivityLocked()
5、realStartActivityLocked()调用app.thread.scheduleLaunchActivity()
app.thread就是ApplicationThread,ApplicationThread继承了ApplicationThreadNative,而ApplicationThreadNative继承了Binder并实现了IApplicationThread接口,scheduleLaunchActivity()内部使用Handler来处理消息。
6、Handler接收到LAUNCH_ACTIVITY这个消息后,调用handleLaunchActivity(),然后内部调用performLaunchActivity()
performLaunchActivity()完成的任务:
- 1)从ActivityClientRecord中获取待启动的Activity的组件信息
- 2)通过Instrumentation的newActivity()使用类加载器创建Activity对象
- 3)通过LoadedApk的makeApplication()来创建Application对象:
Application创建完毕后,系统会通过Instrumentation的callApplicationOnCreate方法来调用Application的onCreate方法。
- 4)创建ContextImpl对象并通过Activity的attach()来完成一些重要数据的初始化:
ContextImpl通过Activity的attach方法来和Activity建立关联,而且在attach方法中,Activity还会完成Window的创建并建立自己和Window的关联。
由于Activity的onCreate()已经被调用,这也意味着Activity完成了启动过程。