最近出去一圈面试,发现现在的android面试不是直接问项目了,而是问原理、源码之类的。就连应届生的面试题也到了这个水平。

而自己去面试一向是不做准备的,做过什么就说什么,因此结果可想而知。别说原理,就是之前自定义view以及activity和service这些常见的生命周期都有哪些名字都记不清了,平时开发都是直接command+N,然后override一下,常用的就几种方法,一般也就创建一个activity的时候会用到,架子搭起来了一般不会有啥变动,我这项目做了三年了,这些调用顺序早就不用改了,偶尔疑问,立马懵逼????

好了,不说废话了,今天下午有点时间,分析下activity的启动,不知道对不对,就一步步跟着源码走吧。

一般我们启动一个activity都是调用context.startActivity那么就从这个方法按F3进入源码看一下

activity的启动过程_启动过程

进来一看,这是个抽象方法,去找实现,command+右键找

activity的启动过程_android_02

activity的启动过程_生命周期_03

然后我们找到了mMainThread.getInstrumentation的execStartActivity方法,继续追踪

activity的启动过程_编程能力_04

这里看到该方法先检测这个activity有没有启动,没有的话再调用activityManager的service的startActivity方法,继续

activity的启动过程_android_05

这货是一个binder啊,难道这就是传说中的activityManagerService?人们简称AMS?

好了,按照这个假设,去找实现ams,果然在ams里找到了

activity的启动过程_生命周期_06

追踪这个startActivityMayWait方法,这个在ActivityStarter类中,代码太长了,只截取一部分,有兴趣的话来看行数,我的api版本是api27,去面试一哥们儿问我你凭什么轻易就升级api27了?升级到api26需要注意什么你知道吗,我当然知道,我只关心我用的,你说的那些画中画和通知渠道以及悬浮窗什么的我又没用到,我懒得跟你扯。

activity的启动过程_生命周期_07

这里大概就是解析activity的一些信息还有用户信息?后面有个activityStack和activityRecord要注意了,看名字是来记录activity的,所以真正的启动应该在这里,果然就在activityRecord的下一行

activity的启动过程_启动过程_08

真正的启动方法就是startActivityLocked方法,后面都是一些状态的返回了,那我们继续追踪这个方法

activity的启动过程_配置信息_09

又调用了startActivity方法,继续。。。。

一路追踪下去好累,启动前做了很多判断,例如intent的各种action啊,flag啊,后面还有task、stack之类的,这一个跳一个的,我要分析的是启动,不是检查这么多,这些就不贴了,最后找到的方法是

activity的启动过程_生命周期_10

 

 相信你也有点蒙圈了,这好像在转圈啊

不管了,继续吧,看看最后跳到哪里去

activity的启动过程_android_11

最后又来到了activityStackSupervisor中,然后看这个方法低1456行有一个方法叫做app.thread.scheduleLaunchAcitivity,果然在这里

activity的启动过程_android_12

这货是啥啊,又是红色的,先看thread是啥

activity的启动过程_生命周期_13

这个。。。。红色的搜不到啊,双击shift试试

activity的启动过程_启动过程_14

额。。。。还是不行,顺着这个ProcessRecord类找吧

activity的启动过程_android_15

 

看看这个makeActive在哪里调用,居然又是ams,熟悉的面孔!????

 activity的启动过程_生命周期_16

activity的启动过程_android_17

然后再看看mSystemThread是什么鬼

activity的启动过程_编程能力_18

居然是activityThread,那这个getApplicationThread就是一个成员了,进去瞧瞧

activity的启动过程_配置信息_19

猜的没错,到这里了,刚才想干啥来着?对了分析启动过程嘛不是?

就是调用了这个applicationThread的scheduleLaunchActivity,这下就好找了

activity的启动过程_启动过程_20

这居然有个如此熟悉的sendMessage,当然识趣找对应的handleMessage啦,继续

activity的启动过程_生命周期_21

这不就有了么,下一个目标handleLaunchAcitivity,come on!

activity的启动过程_配置信息_22

 

好了,performLaunchActivity,继续

activity的启动过程_android_23

原来真正的核心在这里,获取了一些activityInfo,然后通过创建一个appContext,然后用mInstumentation的newActivity方法通过classloader创建了activity对象,接下来又makeApplication对象,代码太长,下一张图再继续说

activity的启动过程_启动过程_24

有了application后接着得到一些配置信息,然后调用acitivity的attach实现配置,后面又设置主题,然后调用了mInstrumentaion的callActivityOnCreate方法。

到此启动完毕!!!

通过这次追踪我们学到了什么?为什么要了解这个启动过程?我还是一脸懵逼,因为我平时用不到啊,不知道为什么要问这些,就算知道了你也改不了啊,我们又不做rom。从以前的面试只说四大组件和一些布局,到现在动不动问原理,android面试题多了很多,但是你就不能问问项目经验啊,编程重要的的是什么?不是面试,而是实战,要考察的是编程能力,很大程度上是对程序的逻辑思维能力以及编码的整洁规范的问题。如果一个面试官非要对一个上层app开发追着启动过程问个不停,那他肯定也不是什么好的面试官,鉴定完毕!!