Android5.0 Framework - Activity启动过程(一)
标签(空格分隔): Android Framework
1. 打开Activity
startActivity(new Intent(MyActivity.this, OtherActivity.class));
2. 进入Activity源码分析
android.app.Activity
@Override
//入口
public void startActivity(Intent intent) {
this.startActivity(intent, null);
}
….省略代码…
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
// Note we want to go through this call for compatibility with
// applications that may have overridden the method.
//-1表示不需要这个Actvity结束后的返回结果
startActivityForResult(intent, -1);
}
}
….省略代码…
public void startActivityForResult(Intent intent, int requestCode) {
startActivityForResult(intent, requestCode, null);
}
最终到startActivityForResult(intent, requestCode, null);
方法处理
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
//Activity启动执行交由Instrumentation对象去处理
//ActivityThread mMainThread 是应用程序的主线程
//Instrumentation mInstrumentation来监控应用程序和系统的交互
//mToken也是Activity类的成员变量,它是一个Binder对象的远程接口
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
//发送结果,即onActivityResult会被调用
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
if (requestCode >= 0) {
mStartedActivity = true;
}
final View decor = mWindow != null ? mWindow.peekDecorView() : null;
if (decor != null) {
decor.cancelPendingInputEvents();
}
// TODO Consider clearing/flushing other event sources and events for child windows.
} else {
//在ActivityGroup内部的Activity调用startActivity的时候会走到这里,内部处理逻辑和上面是类似的
if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
// Note we want to go through this method for compatibility with
// existing applications that may have overridden it.
mParent.startActivityFromChild(this, intent, requestCode);
}
}
if (options != null && !isTopOfTask()) {
mActivityTransitionState.startExitOutTransition(this, options);
}
}
- 主要参数说明:
- mInstrumentation:Instrumentation用来辅助Activity完成启动Activity的过程
- this:当前对象,也就是上下文
- mMainThread.getApplicationThread():ActivityThread是主线程
- mToken:是IBinder是远程接口,主要用于数据传输
那么Instrumentation到底如何启动Activity待续…