3. 四大组件面试题:Activity 生命周期、Fragment 通信、Service 保活、BroadcastReceiver 注册
本章聚焦四大组件高频面试点:Activity 生命周期异常处理、Fragment 与 Activity 通信方式、Service 保活策略、BroadcastReceiver 动态注册细节。掌握这些,可覆盖 90% 的组件面试题。
3.1 面试题:Activity 旋转屏幕后生命周期如何执行?数据如何恢复?
面试官考察点:是否理解配置变更导致的重建流程、onSaveInstanceState 和 ViewModel 的区别、对启动模式的影响。常见于系统应用或 SDK 开发场景。
回答框架:
- 明确场景为配置变更(旋转),而非系统杀进程。
- 回调顺序:
onPause → onSaveInstanceState → onStop → onDestroy → onCreate → onStart → onRestoreInstanceState → onResume。 - 数据恢复方式:
onRestoreInstanceState从 Bundle 中取出;或在 ViewModel 中通过SavedStateHandle自动恢复。 - 若 Activity 设置
configChanges="orientation|screenSize",则只调用onConfigurationChanged,不重建。
简短示例回答:
旋转屏幕时 Activity 会重建,回调顺序为 onPause → onSaveInstanceState → onStop → onDestroy → onCreate → onStart → onRestoreInstanceState → onResume。数据恢复优先使用 ViewModel,配合 SavedStateHandle 自动处理;或重写 onSaveInstanceState 保存轻量数据。若需避免重建,可在清单中配置 configChanges。
可能追问:
- onSaveInstanceState 和 onRestoreInstanceState 调用的时机细节?
- 如果 Activity 被系统杀进程,数据还能通过 Bundle 恢复吗?(答:可以,但需注意 Bundle 大小限制)
- ViewModel 和 onSaveInstanceState 的区别?
3.2 面试题:Fragment 与 Activity 以及 Fragment 之间的通信方式有哪些?推荐哪种?
面试官考察点:是否熟悉多种通信方式,能否根据场景选择最优解;是否了解 LiveData/Flow 等现代架构组件;是否理解松耦合原则。
回答框架:
- 列举方式:接口回调、EventBus、ViewModel + LiveData、广播、直接调用。
- 推荐方式:ViewModel + LiveData/Flow(Fragment 共享 ViewModel),自动感知生命周期,避免内存泄漏。
- 若 Fragment 间无共同父 Activity,可使用
parentFragmentManager.setFragmentResultListener(官方推荐)或共享 ViewModel 通过 Activity 作用域。
简短示例回答:
Fragment 通信推荐使用 ViewModel + LiveData:在 Activity 作用域中创建 ViewModel,多个 Fragment 共享该 ViewModel,通过 LiveData 观察数据变化。这种方式自动管理生命周期,无需手动注册/注销,符合 MVVM 架构。若仅传递一次性事件,可用 setFragmentResultListener。
可能追问:
- 多个 Fragment 共享 ViewModel 时,如何保证作用域正确?
- setFragmentResultListener 与 ViewModel 的区别?
- EventBus 的缺点是什么?
3.3 面试题:如何在 Android 高版本下实现 Service 保活?动态注册 BroadcastReceiver 时有什么注意事项?
面试官考察点:是否了解后台限制策略(8.0+ 限制后台 Service、10.0+ 限制后台启动 Activity);是否掌握合规保活方式;是否清楚动态注册与静态注册的差异。
回答框架:
- 明确高版本限制:Android 8.0 后
startService不可在后台启动,需用startForegroundService并显示通知。 - 合规保活方案:前台服务 + 高优先级通知;JobScheduler 延迟执行;WorkManager 保证任务完成。
- 动态注册 BroadcastReceiver:在
onResume注册、onPause注销;注意 context 选择(Activity vs Application)。
简短示例回答:
高版本下无法真正“保活”,推荐使用前台服务 + 常驻通知,或 WorkManager 保证后台任务完成。动态注册 BroadcastReceiver 应在 onResume 中 register,onPause 中 unregister,避免内存泄漏;选用 Application Context 可延长生命周期,但需注意匿名的 BroadcastReceiver 内部类会持有 Activity 引用。
可能追问:
- Android 12 的“精确闹钟”权限对保活的影响?
- 如果需要在后台接收开机广播,静态注册和动态注册如何选择?
- WorkManager 的 Guaranteed Execution 机制原理?
3.4 项目案例:短视频社交 App 的四大组件实战
| 项目名称 | VivaPeak 短视频平台(Android 端) |
| 业务背景 | 支持短视频拍摄、上传、实时消息推送、后台播放音乐。需保证后台任务稳定,并处理横屏拍摄时的屏幕旋转。 |
| 规模指标 | DAU 500 万;Android 端安装包 35MB;支持 Android 8.0~14.0,覆盖 2 万+ 机型 |
| 技术栈 | Jetpack Navigation + ViewModel + LiveData,ExoPlayer 后台播放,Firebase CloudMessaging,WorkManager 上传任务,OkHttp + Retrofit |
| 核心难点 |
|
| 面试高频追问 |
|
| 可迁移回答话术 |
|