IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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()
                .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启动的大致流程,里面还有很多细节值得我们探讨。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:35:55  更:2021-12-24 18:37:26 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码