2011-9-27 22:02:12
在Step 1中,我們看到,Launcher繼承於Activity類,而Activity類實現了startActivity函數,因此,這裏就調用了Activity.startActivity函數,
它實現在frameworks/base/core/java/android/app/Activity.java文件中:
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks {
......
@Override
public void startActivity(Intent intent) {
startActivityForResult(intent, -1);
}
......
} 這個函數實現很簡單,它調用startActivityForResult來進一步處理,第二個參數傳入-1表示不需要這個Actvity結束後的返回結果。
Step 3. Activity.startActivityForResult
這個函數也是實現在frameworks/base/core/java/android/app/Activity.java文件中:
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks {
......
public void startActivityForResult(Intent intent, int requestCode) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
......
} else {
......
}
......
}
這裏的mInstrumentation是Activity類的成員變量,它的類型是Intrumentation,定義在frameworks/base/core/java/android/app/Instrumentation.java文件中,
它用來監控應用程序和系統的交互。
這裏的mMainThread也是Activity類的成員變量,它的類型是ActivityThread,它代表的是應用程序的主線程,我們在Android系統在新進程中啓動自定義服務過程
(startService)的原理分析一文中已經介紹過了。這裏通過mMainThread.getApplicationThread獲得它裏面的ApplicationThread成員變量,
它是一個Binder對象,後面我們會看到,ActivityManagerService會使用它來和ActivityThread來進行進程間通信。
這裏我們需注意的是,這裏的mMainThread代表的是Launcher應用程序運行的進程。
這裏的mToken也是Activity類的成員變量,它是一個Binder對象的遠程接口。