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

在整个Activity启动流程中,这一步是比较简单的.主要是在Launcher中对应的*Activity类到框架代码的Acitivity类及其父类,Instrumentation类,ActivityTaskManager的本地代理类之间跳转条用.在这里我们主要是要搞清楚用到的类之间的继承和调用关系.

我们先简单看下调用栈

  1. execStartActivity:1723, Instrumentation (android.app)
  2. startActivityForResult:5320, Activity (android.app)
  3. startActivityForResult:767, FragmentActivity (androidx.fragment.app)
  4. startActivityForResult:5278, Activity (android.app)
  5. startActivityForResult:754, FragmentActivity (androidx.fragment.app)
  6. startActivity:5664, Activity (android.app)
  7. startActivity:5617, Activity (android.app)
  8. onClick:40, MainActivity$1 (com.awy.myapplication)
  9. performClick:7448, View (android.view)
  10. performClickInternal:7425, View (android.view)
  11. access$3600:810, View (android.view)
  12. run:28305, View$PerformClick (android.view)
  13. handleCallback:938, Handler (android.os)
  14. dispatchMessage:99, Handler (android.os)
  15. loop:223, Looper (android.os)
  16. main:7656, ActivityThread (android.app)
  17. invoke:-1, Method (java.lang.reflect)
  18. run:592, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
  19. main:947, ZygoteInit (com.android.internal.os)
  1. 从调用栈很简单可以看到这里就是在startActivity->startActivityForResult之间跳转.这里我存在一个疑问,就是怎么从Android框架的android.app.Activity 调用到androidx.fragment.app.FragmentActivity去的.我从代码中没有他们有继承关系.
  2. 实际执行启动Activity的操作是在mIntrumentation中.

Instrumentation中的execStartActivity操作

  1. intent.migrateExtraStreamToClipData(who);
  2. intent.prepareToLeaveProcess(who);
  3. int result = ActivityTaskManager.getService().startActivity(whoThread,
  4. who.getBasePackageName(), who.getAttributionTag(), intent,
  5. intent.resolveTypeIfNeeded(who.getContentResolver()), token,
  6. target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
  7. checkStartActivityResult(result, intent);
  1. 准备Intent离开进程的一些操作,后续就会传递到ATMS中去了
  2. 通过ActivityTaskManager.getService()获取ATMS的本地代理对象,并调用startActivity.
  3. 检查调用的结果.

获取ATMS的本地代理对象

  1. /** @hide */
  2. public static IActivityTaskManager getService() {
  3. return IActivityTaskManagerSingleton.get();
  4. }
  5. @UnsupportedAppUsage(trackingBug = 129726065)
  6. private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
  7. new Singleton<IActivityTaskManager>() {
  8. @Override
  9. protected IActivityTaskManager create() {
  10. final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
  11. return IActivityTaskManager.Stub.asInterface(b);
  12. }
  13. };

这里使用了一个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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号