天天看點

Android5.0 Framework - Activity啟動過程(一)Android5.0 Framework - Activity啟動過程(一)

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, -, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            //-1表示不需要這個Actvity結束後的傳回結果
            startActivityForResult(intent, -);
        }
    }
           

….省略代碼…

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 >= ) {
                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待續…