在整個Activity啟動流程中,這一步是比較簡單的.主要是在Launcher中對應的*Activity類到框架代碼的Acitivity類及其父類,Instrumentation類,ActivityTaskManager的本地代理類之間跳轉條用.在這里我們主要是要搞清楚用到的類之間的繼承和呼叫關系.
我們先簡單看下呼叫堆疊
execStartActivity:1723, Instrumentation (android.app)
startActivityForResult:5320, Activity (android.app)
startActivityForResult:767, FragmentActivity (androidx.fragment.app)
startActivityForResult:5278, Activity (android.app)
startActivityForResult:754, FragmentActivity (androidx.fragment.app)
startActivity:5664, Activity (android.app)
startActivity:5617, Activity (android.app)
onClick:40, MainActivity$1 (com.awy.myapplication)
performClick:7448, View (android.view)
performClickInternal:7425, View (android.view)
access$3600:810, View (android.view)
run:28305, View$PerformClick (android.view)
handleCallback:938, Handler (android.os)
dispatchMessage:99, Handler (android.os)
loop:223, Looper (android.os)
main:7656, ActivityThread (android.app)
invoke:-1, Method (java.lang.reflect)
run:592, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
main:947, ZygoteInit (com.android.internal.os)
- 從呼叫堆疊很簡單可以看到這里就是在startActivity->startActivityForResult之間跳轉.這里我存在一個疑問,就是怎么從Android框架的android.app.Activity 呼叫到androidx.fragment.app.FragmentActivity去的.我從代碼中沒有他們有繼承關系.
- 實際執行啟動Activity的操作是在mIntrumentation中.
Instrumentation中的execStartActivity操作
intent.migrateExtraStreamToClipData(who);
intent.prepareToLeaveProcess(who);
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token,
target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
checkStartActivityResult(result, intent);
- 準備Intent離開行程的一些操作,后續就會傳遞到ATMS中去了
- 通過ActivityTaskManager.getService()獲取ATMS的本地代理物件,并呼叫startActivity.
- 檢查呼叫的結果.
獲取ATMS的本地代理物件
/** @hide */
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}
@UnsupportedAppUsage(trackingBug = 129726065)
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
return IActivityTaskManager.Stub.asInterface(b);
}
};
這里使用了一個Singleton的類IActivityTaskManager,這是一個單例模式的實作.在其中的create函式呼叫ServiceManager去獲取了一個IBinder物件,并通過IActivityTaskManager.Stub.asInterface(b)轉換為本地代理物件.(這里是Binder相關知識,可以參考(IT先森的Binder相關博文 "https://blog.csdn.net/tkwxty/article/details/112325376")https://blog.csdn.net/tkwxty/article/details/112325376)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/273198.html
標籤:其他
