Activity的工作过程
注意:探究源代码别处于“只见树木,不见森林”的状态。
Activity.startActivity()---->
Activity.startActivityForResult()---->
mInstrumentation.execStartActivity()---->
ActivityManager.getDefault().startActivity()
ActivityManager.getDefault().startActivity()分析:
ActivityManagerService(AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS 也是一个Binder,它是IActivityManager的具体实现,这里getDefault会返回一个单例的AMS对象,所启动流程转到AMS.startActivity();
我们先回过头看mInstrumentation的execStartActivity方法,其中有一行代码:checkStartActivityResult(result,indent),作用就是检查启动Activity的结果。当无法正确地启动一个Activity时,这个方法会抛出异常,其中有我们熟悉的“Unable to find explicit class;have you declared this activity in your AndroidManifest.xml?”
AMS.startActivity()---->
AMS.startActivityAsUser()---->
ActivityStackSupervisor.startActivityMayWait()---->
ActivityStackSupervisor.startActivityLocked()---->
ActivityStackSupervisor.startActivityUncheckedLocked()---->
ActivityStack.resumeTopActivityLocked()---->
ActivityStack.resumeTopActivityInnerLocked()---->
ActivityStackSupervisor.startSpecificActivityLocked()---->
ActivityStackSupervisor.realStartActivityLocked()
ActivityStackSupervisor.realStartActivityLocked()---->
app.Thread.scheduleLaunchActivity()
app.Thread是一个IApplicationThread类型,IApplicationThread声明了很多启动、停止Activity的接口,此外还包含了启动和停止Service的接口。
看一下ApplicationThead的定义:
private class ApplicationThread extends ApplicationThreadNative
public abstract class ApplicationThreadNative extends Binder implements IApplicationThread
看声明可以看出,IApplicationThread的真正实现类是ApplicationThread,它是ActivityThread一个内部类。在ApplicationThreadNative内部,有一个ApplicationThreadProxy类,这个类是系统AIDL文件生成的代理类,又由于ApplicationThreadNative是一个抽象类,所以ApplicationThread成了IApplicationThread最终实现者。
绕了一大圈,Activity的恶启动过程最终回到了ApplicationThread中,ApplicationThread通过scheduleLaunchActivity方法来启动Activity。
ApplicationThread.scheduleLaunchActivity()---->
H.sendMesasge(H.LAUNCH_ACTIVITY,r)---->
ActivityThread.handleLaunchActivity()---->
ActivityThread.performeLaunchActivity()+ActivityThread.handleResumeActivity()
performLaunchActivity方法最终完成了Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用启动Activity的onResume这一声明生命周期方法。
performLaunchActivity这个方法主要完成如下几件事:
1.从ActivityClientRecord中获取启动的 Activity的组件信息
2.通过Instrumentation的newActivity方法使用类加载器创建Activity对象
cl.loadClass(className).newInstance()
3.通过LoadedApk的makeApplication方法来尝试创建Application对象。
如果Application已经被创建过了,那么就不会再重复创建了,这也意味着一个应用只有一个Application对象。Application对象的创建也是通过Instrumentation来完成的恶,整个过程和Activity对象创建一样,都是通过类加载器来实现的,Application创建完毕后,系统会通过Instrumentation的callApplicationOnCreate来调用Application的onCreate方法。
4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化
ContextImpl是一个很重要的数据结构,它是Context的具体实现,Context中的大部分逻辑都是由ContextImpl来完成的。ContextImpl是通过Activity的attach方法来和Activity建立关联的,除此之外,在attach方法 中Activity还会完成Window的创建并建立自己和Window的关联,这样当Window接收到外部输入事件后就可以将事件传递给Activity。
5.调用Activity的onCreate方法
mInstrumentation.callActivityOnCreate(activity,r.state),由于Activity的onCreate已经被调用了,这也意味着Activity已经完成了整个启动过程。