第四章 四大组件、View体系、消息机制、事件分发

本章涵盖Android面试中最核心的四大组件、View体系、消息机制与事件分发。掌握这些知识,你需要具备从生命周期、绘制流程到异步通信、触摸传递的完整闭环认知。下面通过一张回答框架图,快速建立结构化的答题思维。

Android 基础核心回答框架 四大组件 生命周期 + 启动模式 View 体系 绘制流程 + 自定义 View 消息机制 Handler + Looper 事件分发 三阶段 + 消费/拦截

面试问答卡 1:四大组件生命周期与作用

面试问题:请简述 Android 四大组件的生命周期和作用,并解释 Service 与 Activity 通信的方式。

考察点:对四大组件基本概念和典型场景的理解,能否区分不同组件的用途及生命周期关键回调。

回答框架:总 → 分 → 特例。先说明四大组件的定义和各自用途,再重点展开 Activity 和 Service 生命周期,最后解释 Service 通信方式(Intent、Binder、Messenger)。

示例回答:四大组件包括 Activity、Service、BroadcastReceiver、ContentProvider。Activity 负责 UI 交互,生命周期关键为 onCreate→onStart→onResume→onPause→onStop→onDestroy。Service 后台执行,可通过 onBind 实现通信,绑定后生命周期与调用方关联,常用 Binder 或 Messenger。

可能追问:Service 的两种启动方式区别?onStartCommand 返回值含义?如果 Service 被系统杀死如何恢复?

避坑提醒:不要混淆 Service 与 Thread,Service 默认运行在主线程。回答通信方式时一定要提到 Intent 传参和 Binder 机制,并说明适用场景。

面试问答卡 2:View 绘制流程

面试问题:简述 View 的绘制流程,如何自定义 View 实现一个圆形图片控件?

考察点:对 View 三大流程(measure、layout、draw)的理解,能否结合自定义 View 实际项目经验。

回答框架:总 → 三步骤 → 自定义关键。先说明绘制从 ViewRootImpl 的 performTraversals 开始,再分述 onMeasure(确定尺寸)、onLayout(确定位置)、onDraw(绘制内容),最后指出自定义 View 需重写 onDraw 并通过 canvas.clipPath 实现圆形裁剪。

示例回答:绘制流程从 measure 开始,确保父 View 与子 View 尺寸匹配。接着 layout 确定位置坐标,最后 draw 绘制内容。自定义圆形图片:在 onDraw 中使用 BitmapShader 和 canvas.drawCircle,注意处理 centerCrop 裁剪逻辑,避免 OOM。

可能追问:MeasureSpec 的作用?match_parent 和 wrap_content 在 measure 时如何处理?View 的 invalidate 和 requestLayout 区别?

避坑提醒:不要只背流程,要结合自定义 View 说明实际遇到的坑,比如 measure 时 padding 处理、draw 时硬件加速限制。回答中体现性能优化意识(避免在 onDraw 中创建对象)。

面试问答卡 3:事件分发机制

面试问题:请解释 Android 触摸事件分发机制,如何解决滑动冲突?

考察点:对事件分发三阶段(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)的掌握,以及实际场景中滑动冲突的解决策略。

回答框架:总 → 三阶段 → 解决冲突。先说明事件从 Activity→ViewGroup→View 的传递,再分析 onIntercept 拦截时机和 onTouchEvent 消费规则。接着给出滑动冲突解决思路:外部拦截法(重写父容器 onIntercept)或内部拦截法(子 View 通过 requestDisallowInterceptTouchEvent 控制)。

示例回答:事件分发核心:dispatchTouchEvent 决定是否分发,onIntercept 决定是否拦截,onTouchEvent 决定是否消费。例如 ScrollView 中嵌套 ViewPager 的横向滑动,采用外部拦截法:在 ScrollView 的 onIntercept 中判断滑动方向,垂直滑动时才返回 true。

可能追问:onClick 和 onTouch 的执行顺序?ACTION_CANCEL 的触发场景?如何判断点击事件和滑动事件?

避坑提醒:避免只讲理论,要结合实际项目。如果画板应用中的橡皮擦与手势滑动冲突,我采用内部拦截法并重写 onTouchEvent 的 consume 逻辑。强调正确使用 return true/false 控制事件链。

章节复习要点(自测清单):

  • ❓ 能流畅写出四大组件生命周期图并说出每个回调的使用场景
  • ❓ 能解释 MeasureSpec 如何通过 size 和 mode 组成,以及自定义 View 时如何配合
  • ❓ 能画出事件分发的完整流程图,并说明 onTouchEvent 返回值对后续事件的影响
  • ❓ 能结合项目描述一个实际滑动冲突的解决过程