先说说最近的面试情况。

今年上半年参加了PDD,美团,字节,阿里,还有部分中小厂面试,最终拿到了3家offer(某小公司、字节、某中型公司),一家在杭州,两家在上海。

23 年初整体感觉虽然相比于去年有所好转,hc 还是有一些的,平均一周两三个面试,但竞争非常激烈,典型的买方市场,导致各家压价情况普遍。

面试难度的话,对于我来说还算可以,在整个面试过程中,问的最多的几个问题:

Binder机制原理

为什么android要用binder当IPC机制

Binder线程池的工作过程是什么样的

Handler怎么进行线程通信,原理是什么?

然后就是围绕着项目,深挖到底层。

这里面我觉得这个问题可能需要讲解下:Handler怎么进行线程通信,原理是什么?很多人不太清楚。

首先从Handler整体思想讲起

在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理。

「面试必背」Android Framework面试题(2023最新版)_android

Handler工作流程

Handler机制的工作流程主要包括4个步骤:

  1. 异步通信准备
  2. 消息发送
  3. 消息循环
  4. 消息处理

具体如下图:

「面试必背」Android Framework面试题(2023最新版)_线程通信_02

Handler工作流程图

如下图所示,handler的总体流程大致如下:

首先,系统通过调用 Looper.prepare()为线程准备Looper 和承接Message 的MessageQueue;

然后,系统再调用Looper.loop()函数,这个函数会开启一个死循环,在循环中不断的轮询MessageQueue消息队列,从消息队列中取出可以执行的Message消息,然后进行执行。

再然后,用户通过Handler.sendMessage这一类的函数调用,向MessageQueue里面不断的发送消息。

最后,由于Looper 中的loop是在不断轮询MessageQueue的,一旦发现MessageQueue里面有可执行的消息,那么就会将消息取出来,然后通过消息所携带的handler去执行。

「面试必背」Android Framework面试题(2023最新版)_android_03

总结

Handler 是一个消息管理机制,android 程序的运行必须依托于Handler机制,那么handler机制进行线程通信的原理思想如下: 1) 在启动handler通信机制的时候,首先会准备Looper,以及必须让Looper调用loop函数进入死循环;2)在Looper启动后,loop死循环就会不断的去轮询MessageQueue的next函数,试图通过这个方式获取到MessageQueue中存储的Message;3)当用户希望往当前创建handler的这个线程里面传递消息的时候,就可以调用这个handler的sendMessage或者postMessage 相关的函数,次数Message将被发送到对应的MessageQueue中;4)在第2)步中,loop里面的循环就会轮询到我们在第3)步中添加的消息,当这个消息被loop轮询到的时候,这个消息就会被处理掉,而且处理的线程就是当前轮询MessageQueue的线程。

总的来说,Handler机制可以理解为 在一个线程中创建了一个Message 对象(内存块),这个Message对象包含了我们要执行的动作;然后我们通过handler将这个Message内存块传给了MessageQueue,也就是说MessageQueue是存储的Message;然后Looper所在的线程通过loop()函数从MessageQueue中取到我们存储的Message,并在当前这个线程中去执行的过程。


「面试必背」Android Framework面试题(2023最新版)_android_04


「面试必背」Android Framework面试题(2023最新版)_内存布局_05

面试过程需要注意什么?

1.跟着面试官的节奏回答问题

在面了这么多场后发现,语速很重要,由于我平常说话都是很快的,所以在面试过程中一般「语速」都比较快,但是有些面试官会比较喜欢稳扎稳打的,语言这种东西在字里行间中也会体现出一个人的性格,当一场面试进行了 10 多分钟左右,你就可以「根据面试官的反馈来调整」自己的语速,能力固然重要,但是面试结果还是掌握在面试官手里的,对不?即使通过了后面的面试到了谈 offer 的时候,之前面试官对你的评价也是很重要的。

2.让面试官跟着自己的节奏来问

这点也是非常重要的一点,尽管你面试可能会有 4~5 轮,但是还是没有办法完全的挖透你,在面试官问到某个问题时,如果你对某个问题了解的比较深入,那么你就「可以抛出更多的知识点让面试官去追问」比如你在回答锁升级的时候可以自己扩展到锁标志位,通过锁标志位还可以扩展的对象的内存布局,通过内存布局还可以扩展到不同操作系统对于内存布局的存储大小通过一个个深入知识点的抛出以及面试官的追问,既可以让面试官发现你是一个平常都会去深入学习的人(每天一个小心机)

结语

面试,难还是不难?取决于面试者的底蕴(气场+技能)、心态和认知及沟通技巧。面试其实可以理解为一场聊天和谈判,在这过程中有心理、思想上的碰撞和博弈。其实你只需要搞清楚一个逻辑:“面试官为什么会这样问?他希望听到什么答案?”然后针对性的准备和回答就行了,无他。