Activity 的创建和加载
1.我们通过调用 startActivity() 方法来启动一个 Activity,startActivity() 方法有几种重载的方式,但都会最终调用 startActivityForResult() 方法,代码如下:
|
|
startActivityForResule() 方法,代码如下:
|
|
在这个方法中,通过 execStartActivity () 方法的调用来开启一个 Activity,这个方法的第二个参数是 mMainThread.getApplicationThread() 方法返回的是一个 ApplicationThread 类型,ApplicationThread 是 ActivityThread 的内部类,ApplicationThread 和 ActivityThread 是 Activity 启动过程中很重要的两个元素, 下面我们接着看 execStartActivity() 方法,代码如下:
|
|
启动 Activity 的实现由 ActivityManagerNative.getDefault().startActivity() 实现。ActivityManagerNative 是一个抽象类,继承自 Binder 并实现了 IActivityManager 接口,ActivityManagerService (AMS) 继承自 ActivityManagerNative,因此 AMS 也是一个 Binder 接口,是 IActivityManager 的具体实现,
在 ActivityManagerNative 中,getDefault() 方法得代码如下:
|
|
AMS 这个Binder 接口 采用单例模式对外提供,由此可以 Activity 的启动是 AMS 调用 startActivity() 方法来启动的,代码如下:
|
|
从这个函数开始由一串很长的方法调用,我们一个一个分析,首先,调用 mActivityStarter.startActivityMayWait() 方法,这个 mActivityStarter 的作用是控制 Activity 的中断和启动,搜集 Activity 启动的相关逻辑;在 ActivityStarter 中有一个 ActivityStackSupervisor 类,这个类的作用是负责管理 ActivityStack; 在 startActivityMayWait() 方法中由调用了 startActivityLocked() 方法,在其中调用 startActivityUnchecked() 方法,接着调用了 resumeFocusedStackTopActivityLocked() 方法,接着调用了 ActivityStack 的 resumeTopActivityUncheckedLocked() 方法,这个启动过程从 ActivityStackSupervisor 转移到 ActivityStack。
分析一下 resumeTopActivityUncheckedLocked() 方法,代码如下:
|
|
在这个方法调用了resumeTopActivityInnerLocked() 方法,接着在其中调用了 ActivityStackSupervisor 的 startSpecificActivityLocked() 方法,代码如下:
|
|
上述代码中,调用了 realStartActivityLocked() 方法;说明 Activity 的启动过程是在 ActivityStackSupervisor 和 ActivityStack 之间传递顺序的。
在 realStartActivityLocked() 方法中,又如下代码:
|
|
在上述代码中,app.thread 的类型为 IApplicationThread,它的作用是负责 activityManager 和 Application 之间的通信,它里面完成了大量的和 activity 以及 service 启动和停止相关的功能,代码如下:
|
|
ApplicationThread 是 IApplicationThread 的实现类,其中 scheduleLaunchActivity() 方法如下:
|
|
它的原理就是发送一个启动 Activity 的消息交由 H(Handler) 处理,实现如下:
|
|
H 的代码如下:
|
|
从上述代码中可以看出, Activity 的启动是由 ActivityThread 的 handleLaunchActivity() 方法实现的,代码如下:
|
|
从上述代码中,performLaunchActivity() 最终完成了 Activity 对象的创建和启动过程,并且 ActivityThread 通过 handleResumeActivity() 方法来调用被启动的 Activity 的 onResume() 方法。
performLaunchActivity() 方法,代码如下:
|
|
ContextImpl 是 Context 的具体实现,它通过 Activity 的 attach() 方法和 Activity 建立关联;在 attach() 方法中还会完成 Window 的创建并建立 Activity 和 Window 的关联,当 Window 接收到外部输入事件后就可以将时间传递给 Activity。
mInstrumentation.callActivityOnCreate() 方法调用 Activity 的 onCreate() 方法,这意味着 Acitivity 的整个启动过程已经完成。