对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程。

在windows系统看,看源码可以通过源码阅读 这个网址查看(AOSPXRef),也可以直接下载整个源码,在Soure Insight中查看

对于activity而言,无论继承的是AppCompatActivity还是其他,最终它的基类是Activity,调用startActivity()启动新的activity,实际上还是要调用startActivityForResult()方法。

调用startActivityForResult()方法启动一个新的activity,需要调用Instrumentation的execStartActivity()方法

我们去看Instrumentation的execStartActivity()方法

它在方法内部调用了

 ActivityTaskManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target, requestCode, 0, null, options);

因此我们需要知道 ActivityTaskManager.getService()获取的是什么东西

从上图中可以看出在activity的创建过程中,涉及到了进程间的通信(Binder),同时返回的是一个 IActivityTaskManager.Stub.asInterface(b)的内容,点击查看发现其实是一堆看不懂的东西,留意一下startActivity的第一个参数是IApplicationThread类型的caller。

因为IActivityTaskManager实际上是一个接口,因此我们需要寻找实现IActivityTaskManager的类,实际上是ActivityTaskManagerService(注意 类似于源码的这种 实现类往往是后面加个Service)

继续在ActivityTaskManagerService中寻找startActivity()方法

发现startActivity中内部调用 了startActivityAsUser()方法,注意第一个参数依旧是IApplicationThread类型的caller。去查看startActivityAsUser()方法

发现 startActivityAsUser()进行了重载,看上图红色部分,用来建造者模式,去寻找getActivityStartController() .obtainStarter是什么,以及执行的execute()方法是什么

实际上是ActivityStartController类型

通过obtainStarter()方法,最终获得的是ActivityStarter类型的内容,从而用于执行execute()方法

去跟踪ActivityStarter的execute()方法

发现会调用sartActivityMayWait()方法或startActivity()方法,sartActivityMayWait()这个方法有点长,截取了关键一段,最终发现还是会调用startActivity()方法。注意现在的第一个参数其实还是上文提到的IApplicaiton类型的caller。

去查看startActivity()方法,发现startActivity()方法进行了多次重载

在最终的startActivity()中,调用了startActivityUnchecked()方法

继续跟踪startActivityUnchecked()方法,发现里面调用mRootActivityContainer .resumeFocusedStacksTopActivities(),而且我们也看到了在activity启动模式中常见的flag(这个不是这篇文章的重点)

去跟踪mRootActivityContainer.resumeFocusedStacksTopActivities()方法,也就是RootActivityContainer类中的方法

发现又进行了重载,里面调用了focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions)

这个focusedStack实际上是ActivityStack(管理activity活动的),去查看里面的resumeTopActivityUncheckedLocked()方法

继续查看resumeTopActivityInnerLocked()方法,发现最终执行了 mStackSupervisor.startSpecificActivityLocked()方法

mStackSupervisor实际上是ActivityStackSupervisor,继续查看

发现调用了realStartActivityLocked()方法,这个方法内容很多

mservice实际上是上文中的ActivityTaskManagerService(转了一圈终于要回来了),可以留意一下clientTransaction中addCallback,添加了一个名为LaunchActivityItem的回调。

获取到的getLifecycleManager实际上是ClientLifecycleManager

去查看ClientLifecycleManager中的scheduleTransaction()方法

实际上调用了参数本身的schedule()方法, 这个transaction实际上就是realStartActivityLocked()方法中的clientTransaction,先去看ClientTransaction的schdule()方法

发现它调用了mClient.scheduleTransaction(),并把自己传了进去

这个mClient又是什么?

其实就是我们上文一直在说的IApplicaionThread,现在去IApplicaionThread中,发现是个.aidl类型的文件,我们去找它的子类ApplicationThread.发现ApplicationThread是ActivityThread的内部类

跟踪上面的scheduleTransaction()方法

发现调用了ActivityThread自身的scheduleTransaction()方法

感觉好像找不到了。。。

ActivityThread继承了ClientTransactionHandler类,去查看该类

感觉离真相越来越近了,发现ClientTransactionHandler类中的scheduleTransaction()方法实际上调用了sendMessage(),实际上ClientTransactionHandler就是一个handler。我们已经知道消息的what是EXECUTE_TRANSACTION,再去ActivityThread中进行查找

在handleMessage()中发现了实际上调用了mTransactionExecutor.execute(transaction);

mTransactionExecutor显而易见是个线程池

在线程池mTransactionExecutor的execute()方法中调用了​ executeCallbacks(transaction);

继续查看​ executeCallbacks(transaction)方法

发现内部调用了item的execute方法,这个item实际上就是 上文中在执行realStartActivityLocked()时添加的LaunchActivityItem,查看LaunchActivityItem里面的execute()方法

调用了client的handleLaunchActivity()方法,逐渐熟悉起来。。。

这个client是参数ClientTransactionHanlder,实际上就是ActivityThread,回到ActivityThread中查看handleLaunchActivity()方法

调用了熟悉的performLaunchActivity()方法

又需要用到Instrumentation的callActivityOnCreate()方法了

很熟悉的配方,调用activity自身的performCreate()方法

最终看到调用了Activity中的onCreate()方法,也就是说一个activity被启动了,这就是安卓10 activity启动的大致流程,里面还有很多细节值得我们探讨。

Activity启动过程——10.0源码分析相关推荐

  1. 2-APP启动过程2+ActivityThread源码分析

    下面看下app初始化的主要步骤,app的初始化时从ActivityThread的main()开始的.首先,ActivityThread并不是一个线程,但它从main()跑起来后,它是程序运行的当前环境 ...

  2. android6.0源码分析之Camera API2.0下的初始化流程分析

    1.Camera2初始化的应用层流程分析 Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程.Camera2.0首先启动的是C ...

  3. Tomcat7.0源码分析——Session管理分析(下)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52451061 前言 在<Tomcat7.0 ...

  4. Android6.0源码分析—— Zygote进程分析(补充)

    原文地址: http://blog.csdn.net/a34140974/article/details/50915307 此博文为<Android5.0源码分析-- Zygote进程分析> ...

  5. android6.0源码分析之Zygote进程分析

    在android6.0源码分析之Runtime的初始化一文中,对Zygote进程的初期的Runtime初始化过程进行了分析,在Runtime启动结束后,会对Zygote进程进行初始化,其它Java进程 ...

  6. android6.0源码分析之Runtime的初始化

    Android运行时作为android架构的一部分,起着非常重要的作用,它和核心库(Core Libraries)组成了Android运行时库层.本文将依据android源码对AndroidRunti ...

  7. android6.0源码分析之Camera2 HAL分析

    1.Camera HAL的初始化 Camera HAL的初始加载是在Native的CameraService初始化流程中的,而CameraService初始化是在Main_mediaServer.cp ...

  8. android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

    1.Camera2 preview的应用层流程分析 preview流程都是从startPreview开始的,所以来看startPreview方法的代码: <code class="hl ...

  9. Tomcat7.0源码分析——请求原理分析(上)

    前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多早期的J2EE项目,由程序 ...

最新文章

  1. 激光雷达选型指南 这2项重要指标却被很多人忽略
  2. python小游戏代码大全-Python小游戏之300行代码实现俄罗斯方块
  3. 找出1000以内的完数,所谓完数是指该数的各因子之和等于该数,如:6 = 1+2+3。
  4. linux系统调用open、write、close、read以及stat函数详解
  5. mysql显示修改密码_MySQL修改密码
  6. SAP ERP与国内ERP系统的对比,为什么建议选SAP
  7. 【论文写作】本科、硕士研究生毕业论文格式问题
  8. 找出数组中从未出现的最小正整数java实现
  9. 【转载】"library not found for - "解决办法
  10. 怎么step into MFC Source code
  11. 计算机组成原理--复习简答题+答案
  12. MicroSIP编译完全手册
  13. 室内外无缝定位导航,GPS系统可以实现吗?
  14. 微信公众号H5页面缓存问题(微信缓存了 index.html 入口)
  15. 【多任务CTR】阿里ESMM:Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conve
  16. Linux代理配置_wuli大世界_新浪博客
  17. C# 游戏制作 | ✨ 简易文字小游戏
  18. 使用cmd命令笔记本电池查看电池寿命
  19. 动物细胞无血清培养基的发展和应用
  20. 敲响警钟:我在台资企业的悲惨待遇

热门文章

  1. Unity3D【Mono Develop脚本编辑器介绍】
  2. python 库下载_python库(whl)文件下载地址
  3. ios逆向- 01逆向原理Class-dump安装及获取头文件
  4. Matplotlib实践之折线图练习
  5. 泛型类及应用和泛型方法
  6. 如何正确学习 Node.js
  7. CentOS 7自定义系统服务(以Phoebus-Olog为例)
  8. 抠图后怎么和背景自然融合?融合背景的抠图技术介绍
  9. js模板引擎渐进--if/else(7)
  10. Python理解力是什么?为什么要使用它们?