第2章 Activity生命周期、Fragment通信、View绘制流程、公司侧重点

本章聚焦Android开发三大高频考点:生命周期管理与异常恢复、Fragment间通信方式、View绘制三大流程。不同大厂侧重略有差异:字节跳动常考旋转场景下的生命周期行为;阿里巴巴偏好Fragment通信的接口回调实现;腾讯则关注自定义View的绘制流程与性能优化。掌握结构化回答框架,能让你在面试中脱颖而出。

明确生命周期阶段 区分正常/异常场景 回调顺序与配对 状态保存与恢复 公司高频场景 图:Activity生命周期面试回答框架

面试问题:请简述Activity的生命周期,并说明屏幕旋转时会发生什么?

面试官考察点: 对生命周期回调顺序的掌握、异常场景的处理能力、状态保存与恢复的实现细节。

回答框架: ① 列出完整生命周期回调(onCreate→onStart→onResume→onPause→onStop→onDestroy),并说明配对关系(如onCreate与onDestroy)。② 强调旋转属于异常销毁重建,Activity会经历onPause→onStop→onDestroy→onCreate→onStart→onResume。③ 主动提及在onSaveInstanceState中保存数据,在onCreate中恢复。

简短示例回答: Activity生命周期包括onCreate到onDestroy六个主要回调,旋转时默认销毁重建:先onPause→onStop→onDestroy,再重新执行onCreate→onStart→onResume。建议在onSaveInstanceState保存数据,在onCreate中恢复,避免数据丢失。字节面试常追问保存时机与恢复时Bundle的key校验。

可能追问: onSaveInstanceState和onRestoreInstanceState的调用时机差异?哪些场景下Activity不会走onDestroy?如果配置了configChanges属性,生命周期如何变化?

避坑提醒: 不要只说“旋转会重建”,要区分正常关闭(按Back键)与异常销毁;避免直接在onStop中保存大量数据,推荐在onPause中保存用户编辑内容。

1. Measure 测量尺寸 2. Layout 布局位置 3. Draw 绘制显示 自定义View重写对应方法 注意:性能优化与测量次数 图:View绘制三大流程

面试问题:Fragment之间如何通信?请列举至少两种方式并比较优劣。

面试官考察点: 对Fragment解耦原则的理解、接口回调与EventBus等方案的选型判断、Activity作为中介的注意事项。

回答框架: ① 推荐接口回调方式:定义接口,Activity实现,Fragment通过回调传递数据,符合单一职责和松耦合。② 替代方案:EventBus(事件总线)适用于跨组件广播,但需注意注册注销与反序列化问题。③ 不推荐直接使用setTargetFragment或SharedPreferences,避免强耦合或延迟。

简短示例回答: 主流方式是通过接口回调:FragmentA定义回调接口,FragmentA的宿主Activity实现接口,将数据传给FragmentB。如需跨页面广播可选EventBus,但要注意订阅者生命周期。阿里巴巴面试官常追问接口回调如何保证线程安全,以及onAttach中强转Activity的风险防范。

可能追问: 接口回调中为什么推荐在onAttach中获取Activity引用?EventBus与LiveData通信的优缺点?Fragment嵌套时如何向父级Activity传递消息?

避坑提醒: 避免在Fragment中直接持有Activity引用导致内存泄漏;使用EventBus时务必在onDestroy注销注册;不要依赖Fragment的setArguments传递复杂对象,建议序列化。

面试问题:请描述View的绘制流程,并说明自定义View时需要注意哪些性能点?

面试官考察点: 对MeasureSpec模式的理解、Layout与Draw的具体执行顺序、自定义布局的优化策略。

回答框架: ① 三步流程:Measure(onMeasure测量宽高,由父容器传入MeasureSpec)、Layout(onLayout确定子View位置)、Draw(onDraw绘制内容,涉及canvas和paint)。② 性能优化:避免在onDraw中创建对象、使用缓存、减少过度绘制、选择合适的布局层级。③ 结合公司场景:腾讯常考onMeasure中MeasureSpec的EXACTLY/AT_MOST/UNSPECIFIED判断逻辑。

简短示例回答: View绘制依次执行measure、layout、draw。onMeasure接收父容器的MeasureSpec,根据模式(EXACTLY/AT_MOST)计算尺寸;onLayout为子View分配坐标;onDraw绘制最终图形。性能上需注意:不在onDraw中new对象,减少invalidate调用频率,避免布局嵌套过深。腾讯面试常要求手写自定义View的onMeasure和onLayout示例。

可能追问: 如何实现自定义ViewGroup的流式布局?onDraw中canvas.save/restore的作用?如何检测并优化过度绘制?

避坑提醒: 别忘了在onMeasure中调用setMeasuredDimension,否则会抛异常;自定义ViewGroup时务必遍历所有子View执行measureChild;不要在onDraw中执行耗时计算,会导致帧率下降。