第四章 四大组件、View体系、消息机制、事件分发
本章涵盖Android面试中最核心的四大组件、View体系、消息机制与事件分发。掌握这些知识,你需要具备从生命周期、绘制流程到异步通信、触摸传递的完整闭环认知。下面通过一张回答框架图,快速建立结构化的答题思维。
面试问答卡 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 被系统杀死如何恢复?
面试问答卡 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 区别?
面试问答卡 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 的触发场景?如何判断点击事件和滑动事件?
章节复习要点(自测清单):
- ❓ 能流畅写出四大组件生命周期图并说出每个回调的使用场景
- ❓ 能解释 MeasureSpec 如何通过 size 和 mode 组成,以及自定义 View 时如何配合
- ❓ 能画出事件分发的完整流程图,并说明 onTouchEvent 返回值对后续事件的影响
- ❓ 能结合项目描述一个实际滑动冲突的解决过程