在整个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)
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);
获取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)
launcher 调用startActivity的时候是怎么调用到ATMS
原文:https://www.cnblogs.com/ancoder/p/14620178.html