Activity启动过程——10.0源码分析
对于一个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源码分析相关推荐
- 2-APP启动过程2+ActivityThread源码分析
下面看下app初始化的主要步骤,app的初始化时从ActivityThread的main()开始的.首先,ActivityThread并不是一个线程,但它从main()跑起来后,它是程序运行的当前环境 ...
- android6.0源码分析之Camera API2.0下的初始化流程分析
1.Camera2初始化的应用层流程分析 Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程.Camera2.0首先启动的是C ...
- Tomcat7.0源码分析——Session管理分析(下)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52451061 前言 在<Tomcat7.0 ...
- Android6.0源码分析—— Zygote进程分析(补充)
原文地址: http://blog.csdn.net/a34140974/article/details/50915307 此博文为<Android5.0源码分析-- Zygote进程分析> ...
- android6.0源码分析之Zygote进程分析
在android6.0源码分析之Runtime的初始化一文中,对Zygote进程的初期的Runtime初始化过程进行了分析,在Runtime启动结束后,会对Zygote进程进行初始化,其它Java进程 ...
- android6.0源码分析之Runtime的初始化
Android运行时作为android架构的一部分,起着非常重要的作用,它和核心库(Core Libraries)组成了Android运行时库层.本文将依据android源码对AndroidRunti ...
- android6.0源码分析之Camera2 HAL分析
1.Camera HAL的初始化 Camera HAL的初始加载是在Native的CameraService初始化流程中的,而CameraService初始化是在Main_mediaServer.cp ...
- android6.0源码分析之Camera API2.0下的Preview(预览)流程分析
1.Camera2 preview的应用层流程分析 preview流程都是从startPreview开始的,所以来看startPreview方法的代码: <code class="hl ...
- Tomcat7.0源码分析——请求原理分析(上)
前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多早期的J2EE项目,由程序 ...
最新文章
- html button 隐藏_java servlet与html数据交互初体验
- 确认访问用户身份的认证
- 基于 DataLakeAnalytics 做跨地域的数据分析 1
- 女主播还是女主播???
- node --- 实现session认证.
- 干货|机器学习零基础?不要怕,吴恩达课程笔记第三周!逻辑回归与正则
- LeetCode 1624. 两个相同字符之间的最长子字符串
- java 线程由浅入深_由浅入深,Java 并发编程中的 Synchronized(一)
- GNS3桥接modem拨号and QOS限速
- dhcp snooping华为_使用DHCP snooping 功能防止DHCP Server仿冒者攻击(华为交换机)
- 今天rpm装glibc和glibc-common版本,出现二个包相互依赖,解决办法
- vc 环境下mysql_windows-VC++6.0环境下C++链接MySQL数据库
- indesign教程,了解基本文本格式
- python excel 教程推荐_python脚本实现数据导出excel格式的简单方法(推荐)
- MyBatis多参数传递之默认命名方式示例——MyBatis学习笔记之十二
- mPaaS小程序创建
- 国产之光!Mac必备长截图软件!iShot 1.7.7中文版
- Python-有道翻译
- perf_event 事件类型与分类
- Modifier private is redundant for enum constructor
热门文章
- 基于keras的猫狗分类(小型卷积神经网络)
- 嵌入式跟踪单元ETB MTB (Micro Trace Buffer )的实现
- 面试题集合(待续更新5/8)
- Linux云计算-03_必备基础命令
- 视频剪辑 多个视频片头减时、片尾减时怎么操作
- 半入耳式耳机哪款音质好?半入耳式蓝牙耳音质排行榜
- Windows可以变小 - 精简你windows的80%想象会怎样?LitePC来帮你
- Head First JAVA(中文第二版)勘误记录
- Angular8.+ 项目引入ngzorro组件nz-month-picker的清空问题
- Vue3 子组件向父组件传值的方法