Android高级工程师面试题全解析:从Handler原理到MCP协议(上篇:基础·消息机制·UI·协程)

作者:

本文整理25道Android高级工程师高频面试题,按模块分为上、下两篇。上篇覆盖:自我介绍、生命周期、消息机制(Handler)、网络框架(Retrofit+OkHttp)、事件分发、协程与数据流。

一、基础与自我介绍

1. 自我介绍

面试的开场定调题。推荐结构:我是谁(背景)→ 我做过什么(2-3个代表性项目,用STAR法则)→ 我擅长什么(1-2个技术标签)→ 我为什么应聘(与岗位的匹配点)。控制在1-2分钟,突出与岗位相关的经历,避免流水账。

2. Activity生命周期

七个回调:onCreate(创建、初始化)→ onStart(可见)→ onResume(可交互)→ onPause(部分不可见)→ onStop(完全不可见)→ onRestart(重新可见)→ onDestroy(销毁)。

重点面试考点:异常销毁与重建(onSaveInstanceState/onRestoreInstanceState)、启动模式对生命周期的影响、A启动B时两者的调用顺序。

3. View与Fragment生命周期的区别

View没有独立的生命周期,只依附于Activity或Fragment的attach/detach过程。Fragment有自己的生命周期(onAttach→onCreate→onCreateView→onViewCreated→onStart→onResume→…→onDestroyView→onDestroy→onDetach),且与Activity生命周期存在对应关系(如Fragment.onStart对应Activity.onStart)。

面试考点常落在:两者回调的先后顺序、onCreateView与onViewCreated的区别、Fragment重叠恢复问题。

二、消息机制

4. Handler相关(流程、同步屏障、无限循环不阻塞)

流程: sendMessage → enqueueMessage 将消息按时间入队 MessageQueue → Looper.loop() 死循环中取 next() → 分发 dispatchMessage → 回调 handleMessage。Handler通过持有Looper所在线程实现”线程切换”。

同步屏障: postSyncBarrier 插入屏障消息,队列中同步消息被拦截,只执行异步消息,用于UI绘制等优先级高的场景(如Choreographer的VSYNC回调)。

无限循环不阻塞: MessageQueue.next() 在无消息时调用 nativePollOnce 进入阻塞,底层用 Linux epoll/pipe 机制,主线程此时不消耗CPU,收到新消息或超时后通过fd唤醒。这就是”死循环却不卡顿”的原因。

5. Retrofit如何和OkHttp联动

Retrofit本质是OkHttp的封装层:Retrofit用动态代理解析接口注解(@GET/@POST等)生成ServiceMethod,把请求描述转换成OkHttp的Request,最终通过OkHttpClient执行网络请求。CallAdapter(协程suspend、RxJava)负责把OkHttp的Callback适配成不同返回类型;Converter负责JSON等数据转换。Retrofit管”协议描述”,OkHttp管”网络执行”,两者通过OkHttpCall桥接。

三、UI与事件

6. 事件分发

核心是三个方法:dispatchTouchEvent(分发)、onInterceptTouchEvent(拦截,仅ViewGroup有)、onTouchEvent(处理)。传递顺序:Activity → ViewGroup → View 自上而下分发,处理则自下而上回溯。记忆口诀:分发自上而下,消费自下而上。

面试考点:DOWN事件决定后续事件由谁处理、requestDisallowInterceptTouchEvent的作用、滑动冲突的解决思路。

四、协程与数据流

7. StateFlow、SharedFlow、LiveData区别

undefined LiveData: 生命周期感知(自动处理订阅者生命周期),但无背压、默认主线程、初始值需要setValue,数据更新只能发生在主线程(postValue异步)。

undefined StateFlow: 有状态(持有最新值、带初始值)、去重(相同值不重复发射)、冷流转热流,适合UI状态。使用需要协程作用域,无生命周期感知。

undefined SharedFlow: 无状态、可多播、支持replay缓存和buffer背压策略,适合事件流(如一次性事件、Toast)。

undefined 选择: UI状态用StateFlow,一次性事件用SharedFlow,需要生命周期感知且不想引入协程用LiveData。

8. 子协程A取消如何不取消子协程B

协程取消是结构化并发:父协程取消会级联取消所有子协程。解法: – 用 SupervisorJob:父协程的取消不会传递给子协程(但子协程失败也不会影响兄弟)。 – 用 supervisorScope:作用域内的子协程互不影响,适合并行任务。 – 给B创建独立的CoroutineScope(如applicationScope)。

注意:SupervisorJob只隔离”取消”和”失败”的传递,B自己主动取消仍然有效。

(下篇预告:并发与数据结构、架构与UI框架、系统设计、AI Agent方向——MCP协议、Skill设计、Harness最小框架等,见《Android高级工程师面试题全解析(下篇)》。)