在整个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)