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