0、启动activity最终还是调用startActivityForResult()方法
Activity#startActivityForResult{
- //这里会启动新的Activity,核心功能都在mMainThread.getApplicationThread()中完成
- Instrumentation.ActivityResult ar =
- mInstrumentation.execStartActivity(
- this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);
-
-
//发送结果,即onActivityResult会被调用
- mMainThread.sendActivityResult( mToken, mEmbeddedID, requestCode, ar.getResultCode(),ar.getResultData());
}
1、真正打开activity的实现在Instrumentation的execStartActivity方法
Instrumentation#execStartActivity(Context who,IBinder contextThread){
- //核心功能在这个whoThread中完成,其内部scheduleLaunchActivity方法用于完成activity的打开
- IApplicationThread whoThread = (IApplicationThread) contextThread;
- //这里才是真正打开activity的地方,核心功能在whoThread中完成。(相当于调用远程接口IApplicationThread中的scheduleLaunchActivity)
- int result = ActivityManagerNative.getDefault()
- .startActivity(whoThread, who.getBasePackageName(), intent,
- intent.resolveTypeIfNeeded(who.getContentResolver()),
- token, target != null ? target.mEmbeddedID : null,
- requestCode, 0, null, null, options);
}
接下来我们要去看看IApplicationThread,因为核心功能由其内部的scheduleLaunchActivity方法来完成,由于IApplicationThread是个接口,所以,我们需要找到它的实现类,我已经帮大家找到了,它就是ActivityThread中的内部类ApplicationThread,看下它的继承关系:
private class ApplicationThread extends ApplicationThreadNative;
public abstract class ApplicationThreadNative extends Binder implements IApplicationThread;
可以发现,ApplicationThread还是间接实现了IApplicationThread接口,先看下这个类的结构:
2、组装activity的记录信息r,并发消息给handler
ApplicationThread#scheduleLaunchActivity{
queueOrSendMessage(H.LAUNCH_ACTIVITY, r);
}
3、处理ApplicationThread中发来的消息
ActivityThread#H extends Handler {
//根据消息类型处理发来的消息
- //这里处理startActivity消息
- handleLaunchActivity(r, null);
}
4、初始化activity,并调用该周期方法
ActivityThread#handleLaunchActivity(r){
Activity a = performLaunchActivity(r, customIntent); //初始化了activity,并调用了onCreate();
接着调用onResume():
handleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed);
根据判断,来调用onPause();
mInstrumentation.callActivityOnPause(r.activity);// 其中mInstrumentation是来辅助activity启动的对象
.....
}
5、activity在该方法中真正完成初始化
ActivityThread#performLaunchActivity(ActivityClientRecord r,..){
- //首先从intent中解析出目标activity的启动参数
- ComponentName component = r.intent.getComponent();
- java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
- //用ClassLoader(类加载器)将目标activity的类通过类名加载进来并调用newInstance来实例化一个对象
- //其实就是通过Activity的无参构造方法来new一个对象,对象就是在这里new出来的。
- activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
- //目标activity的onCreate被调用了,到此为止,Activity被启动了,接下来的流程就是Activity的生命周期了,
- //本文之前已经提到,其生命周期的各种状态的切换由ApplicationThread内部来完成
- mInstrumentation.callActivityOnCreate(activity, r.state);
}
本文详细解析了Android中启动Activity的过程,从startActivityForResult方法入手,深入探讨了Instrumentation、IApplicationThread及ActivityThread等关键组件的作用,最后展示了Activity是如何被初始化和启动的。

被折叠的 条评论
为什么被折叠?



