经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
launcher 调用startActivity的时候是怎么调用到ATMS
来源:cnblogs  作者:alpta  时间:2021/4/6 10:46:26  对本文有异议

在整个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)
  1. 从调用栈很简单可以看到这里就是在startActivity->startActivityForResult之间跳转.这里我存在一个疑问,就是怎么从Android框架的android.app.Activity 调用到androidx.fragment.app.FragmentActivity去的.我从代码中没有他们有继承关系.
  2. 实际执行启动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);
  1. 准备Intent离开进程的一些操作,后续就会传递到ATMS中去了
  2. 通过ActivityTaskManager.getService()获取ATMS的本地代理对象,并调用startActivity.
  3. 检查调用的结果.

获取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)

原文链接:http://www.cnblogs.com/ancoder/p/14620178.html

 友情链接: NPS