| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Activity启动过程——10.0源码分析 -> 正文阅读 |
|
[移动开发]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()获取的是什么东西 ?从上图中可以看出在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启动的大致流程,里面还有很多细节值得我们探讨。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 10:59:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |