Activity启动流程详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haohengyuan/article/details/85062899

image.png
image.png
看到上面的标记A:
image.png

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

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

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

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

看到上图标记G处:
image.png

接着看到标记H:

快受不了啦,还在兜兜转转,抓狂呀,坚持下,看到上图的标记 I :
image.png
image.png
看到上文标记K:
image.png
接着跟进上图标记M:

进入N:

进入O:
image.png
进入P:
image.png
进入Q:
image.png
看到上图说的,scheduleLaunchActivity被调用之后,应用程序的真正的这个提供 远程服务对象的这个方法也会被调用,那么在应用程序中这个对象在哪里被复制呢?关于这一点我在Activity生命周期回调是如何被回调的?有提到过,其实是在ActivityThread中赋值的:
image.png
这里我在强调一下ApplicationThread的作用:
为什么要有ApplicationThread呢?首先Android应用程序可以通过ActivityManager提供给我们的代理类来向系统ActivityManagerService发送信息比如Android应用程序发送信息给系统服务ActivityManagerService
要求启动一个Activity,换句话说Android应用程序持有ActivityManager的代理对象就可以像系统服务ActivityManagerService发消息,那反过来系统服务ActivityManager要向应用程序发送消息应该怎么办?一样的道理系统服务只要持有Android应用程序提供的一个代理对象不就可以了吗?所以这个ApplicationThread对象的意义就在于此。

继续:
image.png

image.png

image.png

image.png
看到V1:
image.png

image.png

上图分析完之后,Activity的onCreate onstart也调用完了,来到V2:


接着看到W1:
image.png
image.png
image.png
再回到W2

image.png

到此Activity的整个启动流程都分析完了,回顾上文分析,Activity的启动流程还是比较复杂的,总结来讲应该重点把握整个流程中,里程碑式的几个事件:

  • Binde机制,Stub代表什么,proxy代表什么
  • ApplicationThread的作用以及在哪里被赋值的
  • H是什么
  • ViewRootImpl 以及 DecorView,View绘制流程

如果你熟悉AIDL的话,你会知道生成的代码的Stub表示的对外提供的远程服务,Proxy则表示这个远程服务对象的代理。
ApplicationThread是android应用程序对外或者说对系统服务ActivityManagerService提供的远程服务,系统服务ActivityManagerService要想控制我的Android应用程序可以通过这个对象的代理对象,反过来android应用程序也是通过ActivityManager的代理对象来向系统服务传递消息的,所以以上复杂兜兜转转的启动流程可以通过以下一张图来极简的描述:
image.png

H是一个Handler类型,先后会创建一个Activity对象,并关联上Context,Window,然后回调oncreat、onstart、之后再来到onResume,onResume这一步要做的东西比较多,这个时候onCreat已经被调用了,所以SetContentView也创建好了,onReSume这一步则是要把这些View绘制出来,首先创建了ViewRootImpl ,然后调用viewRootImpl的setView方法将DecorView设置进ViewRootImpl,这个方法之后View的绘制流程就即将开启了。

总结

Activity启动流程是面试中常问的问题,我认为在回答的时候最好能将我上面提到的几个“里程碑事件”有机的组合在一起描述 回到,反而那些函数跳来跳去的兜兜转转并不重要,也不太可能记得住,记住核心的东西本质的东西才最重要。

猜你喜欢

转载自blog.csdn.net/haohengyuan/article/details/85062899