activity的启动过程
最近出去一圈面试,发现现在的android面试不是直接问项目了,而是问原理、源码之类的。就连应届生的面试题也到了这个水平。
而自己去面试一向是不做准备的,做过什么就说什么,因此结果可想而知。别说原理,就是之前自定义view以及activity和service这些常见的生命周期都有哪些名字都记不清了,平时开发都是直接command+N,然后override一下,常用的就几种方法,一般也就创建一个activity的时候会用到,架子搭起来了一般不会有啥变动,我这项目做了三年了,这些调用顺序早就不用改了,偶尔疑问,立马懵逼😂
好了,不说废话了,今天下午有点时间,分析下activity的启动,不知道对不对,就一步步跟着源码走吧。
一般我们启动一个activity都是调用context.startActivity那么就从这个方法按F3进入源码看一下
进来一看,这是个抽象方法,去找实现,command+右键找
然后我们找到了mMainThread.getInstrumentation的execStartActivity方法,继续追踪
这里看到该方法先检测这个activity有没有启动,没有的话再调用activityManager的service的startActivity方法,继续
这货是一个binder啊,难道这就是传说中的activityManagerService?人们简称AMS?
好了,按照这个假设,去找实现ams,果然在ams里找到了
追踪这个startActivityMayWait方法,这个在ActivityStarter类中,代码太长了,只截取一部分,有兴趣的话来看行数,我的api版本是api27,去面试一哥们儿问我你凭什么轻易就升级api27了?升级到api26需要注意什么你知道吗,我当然知道,我只关心我用的,你说的那些画中画和通知渠道以及悬浮窗什么的我又没用到,我懒得跟你扯。
这里大概就是解析activity的一些信息还有用户信息?后面有个activityStack和activityRecord要注意了,看名字是来记录activity的,所以真正的启动应该在这里,果然就在activityRecord的下一行
真正的启动方法就是startActivityLocked方法,后面都是一些状态的返回了,那我们继续追踪这个方法
又调用了startActivity方法,继续。。。。
一路追踪下去好累,启动前做了很多判断,例如intent的各种action啊,flag啊,后面还有task、stack之类的,这一个跳一个的,我要分析的是启动,不是检查这么多,这些就不贴了,最后找到的方法是
相信你也有点蒙圈了,这好像在转圈啊
不管了,继续吧,看看最后跳到哪里去
最后又来到了activityStackSupervisor中,然后看这个方法低1456行有一个方法叫做app.thread.scheduleLaunchAcitivity,果然在这里
这货是啥啊,又是红色的,先看thread是啥
这个。。。。红色的搜不到啊,双击shift试试
额。。。。还是不行,顺着这个ProcessRecord类找吧
看看这个makeActive在哪里调用,居然又是ams,熟悉的面孔!😂
然后再看看mSystemThread是什么鬼
居然是activityThread,那这个getApplicationThread就是一个成员了,进去瞧瞧
猜的没错,到这里了,刚才想干啥来着?对了分析启动过程嘛不是?
就是调用了这个applicationThread的scheduleLaunchActivity,这下就好找了
这居然有个如此熟悉的sendMessage,当然识趣找对应的handleMessage啦,继续
这不就有了么,下一个目标handleLaunchAcitivity,come on!
好了,performLaunchActivity,继续
原来真正的核心在这里,获取了一些activityInfo,然后通过创建一个appContext,然后用mInstumentation的newActivity方法通过classloader创建了activity对象,接下来又makeApplication对象,代码太长,下一张图再继续说
有了application后接着得到一些配置信息,然后调用acitivity的attach实现配置,后面又设置主题,然后调用了mInstrumentaion的callActivityOnCreate方法。
到此启动完毕!!!
通过这次追踪我们学到了什么?为什么要了解这个启动过程?我还是一脸懵逼,因为我平时用不到啊,不知道为什么要问这些,就算知道了你也改不了啊,我们又不做rom。从以前的面试只说四大组件和一些布局,到现在动不动问原理,android面试题多了很多,但是你就不能问问项目经验啊,编程重要的的是什么?不是面试,而是实战,要考察的是编程能力,很大程度上是对程序的逻辑思维能力以及编码的整洁规范的问题。如果一个面试官非要对一个上层app开发追着启动过程问个不停,那他肯定也不是什么好的面试官,鉴定完毕!!