为了账号安全,请及时绑定邮箱和手机立即绑定

Activity启动流程详解

标签:
Android

webp

webp

image.png


webp

image.png


看到上面的标记A:


webp

image.png

看到标记C处,这个IApplicationThread是什么呢?这个我在Activity生命周期回调是如何被回调的?有解释过,这里我简单的解释一下:这个IApplicationThread是Android应用程序提供对外(即系统ActivityManagerService)提供服务,外部可以持有这个类的proxy来和我的Android应用程序跨进程通信。
接着看到标记D处:
这里调用了ActivityManager.getService如下:

webp


这里通过ServiceManger获取到了系统服务ActivityManager的代理对象,这个am实际上是一个proxy。
回到标记D的后半截startActivity如下:

webp

image.png


webp

image.png


上图提到会导致这个onTransact被调用,那么我们首先要找到AM,这个AM在哪里呢,这个AM一定是继承了Stub的,如下:


webp

image.png

webp

image.png


分析到上图位置,可以看到应用程序要求启动一个新的Activity,然后系统服务ActivityManagerService接收到这个要求,调用它自身的startActivity方法:


webp


看到上图标记G处:


webp

image.png

接着看到标记H:

webp


快受不了啦,还在兜兜转转,抓狂呀,坚持下,看到上图的标记 I :

webp

image.png


webp

image.png


看到上文标记K:

webp

image.png


接着跟进上图标记M:

webp


进入N:

webp


进入O:

webp

image.png


进入P:

webp

image.png


进入Q:

webp

image.png


看到上图说的,scheduleLaunchActivity被调用之后,应用程序的真正的这个提供 远程服务对象的这个方法也会被调用,那么在应用程序中这个对象在哪里被复制呢?关于这一点我在Activity生命周期回调是如何被回调的?有提到过,其实是在ActivityThread中赋值的:

webp

image.png


这里我在强调一下ApplicationThread的作用:
为什么要有ApplicationThread呢?首先Android应用程序可以通过ActivityManager提供给我们的代理类来向系统ActivityManagerService发送信息比如Android应用程序发送信息给系统服务ActivityManagerService
要求启动一个Activity,换句话说Android应用程序持有ActivityManager的代理对象就可以像系统服务ActivityManagerService发消息,那反过来系统服务ActivityManager要向应用程序发送消息应该怎么办?一样的道理系统服务只要持有Android应用程序提供的一个代理对象不就可以了吗?所以这个ApplicationThread对象的意义就在于此。


继续:


webp

image.png

webp



作者:钟离四郎
链接:https://www.jianshu.com/p/cd7c49addb01


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消