四大组件Activity的工作过程

来源:互联网 发布:模块化编程的好处 编辑:程序博客网 时间:2024/06/06 10:34

由于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的关联。
  • 5)调用Activity的onCreate():
由于Activity的onCreate()已经被调用,这也意味着Activity完成了启动过程。

0 0
原创粉丝点击