Android5.0 Framework - Activity启动过程(一)

来源:互联网 发布:情侣套装淘宝网 编辑:程序博客网 时间:2024/05/21 10:52

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待续…

0 0
原创粉丝点击