3. 四大组件面试题:Activity 生命周期、Fragment 通信、Service 保活、BroadcastReceiver 注册

本章聚焦四大组件高频面试点:Activity 生命周期异常处理、Fragment 与 Activity 通信方式、Service 保活策略、BroadcastReceiver 动态注册细节。掌握这些,可覆盖 90% 的组件面试题。

核心原则:回答生命周期题要先描述场景,再逐层拆解回调顺序;Fragment 通信优先推荐 ViewModel + LiveData;Service 保活强调“后台限制下的合规方案”;BroadcastReceiver 注意动态注册 vs 静态注册的灵活性差异。
Activity 生命周期异常处理回答框架 1. 锚定场景 2. 回调顺序 3. 数据保存/恢复 4. 启动模式影响 5. 常见陷阱 旋转 / 后台杀 / 语言切换 onPause → onStop → onDestroy onSaveInstanceState / ViewModel singleTop / singleTask / singleInstance fragment重叠 / 未保存状态

3.1 面试题:Activity 旋转屏幕后生命周期如何执行?数据如何恢复?

面试官考察点:是否理解配置变更导致的重建流程、onSaveInstanceState 和 ViewModel 的区别、对启动模式的影响。常见于系统应用或 SDK 开发场景。

回答框架:

  1. 明确场景为配置变更(旋转),而非系统杀进程。
  2. 回调顺序:onPause → onSaveInstanceState → onStop → onDestroy → onCreate → onStart → onRestoreInstanceState → onResume。
  3. 数据恢复方式:onRestoreInstanceState 从 Bundle 中取出;或在 ViewModel 中通过 SavedStateHandle 自动恢复。
  4. 若 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 的区别?
避坑提醒:不要在 onSaveInstanceState 中保存大量数据(>500KB),否则可能导致 TransactionTooLargeException;而 ViewModel 需配合 SavedStateHandle 才能应对进程被杀场景。

3.2 面试题:Fragment 与 Activity 以及 Fragment 之间的通信方式有哪些?推荐哪种?

面试官考察点:是否熟悉多种通信方式,能否根据场景选择最优解;是否了解 LiveData/Flow 等现代架构组件;是否理解松耦合原则。

回答框架:

  1. 列举方式:接口回调、EventBus、ViewModel + LiveData、广播、直接调用。
  2. 推荐方式:ViewModel + LiveData/Flow(Fragment 共享 ViewModel),自动感知生命周期,避免内存泄漏。
  3. 若 Fragment 间无共同父 Activity,可使用 parentFragmentManager.setFragmentResultListener(官方推荐)或共享 ViewModel 通过 Activity 作用域。

简短示例回答:

Fragment 通信推荐使用 ViewModel + LiveData:在 Activity 作用域中创建 ViewModel,多个 Fragment 共享该 ViewModel,通过 LiveData 观察数据变化。这种方式自动管理生命周期,无需手动注册/注销,符合 MVVM 架构。若仅传递一次性事件,可用 setFragmentResultListener。

可能追问:

  • 多个 Fragment 共享 ViewModel 时,如何保证作用域正确?
  • setFragmentResultListener 与 ViewModel 的区别?
  • EventBus 的缺点是什么?
避坑提醒:避免使用接口回调在 Fragment 间直接通信,容易造成强引用和内存泄漏;EventBus 难以调试且不遵守生命周期。若使用 setFragmentResultListener,需确保 key 唯一且使用 parentFragmentManager。

3.3 面试题:如何在 Android 高版本下实现 Service 保活?动态注册 BroadcastReceiver 时有什么注意事项?

面试官考察点:是否了解后台限制策略(8.0+ 限制后台 Service、10.0+ 限制后台启动 Activity);是否掌握合规保活方式;是否清楚动态注册与静态注册的差异。

回答框架:

  1. 明确高版本限制:Android 8.0 后 startService 不可在后台启动,需用 startForegroundService 并显示通知。
  2. 合规保活方案:前台服务 + 高优先级通知;JobScheduler 延迟执行;WorkManager 保证任务完成。
  3. 动态注册 BroadcastReceiver:在 onResume 注册、onPause 注销;注意 context 选择(Activity vs Application)。

简短示例回答:

高版本下无法真正“保活”,推荐使用前台服务 + 常驻通知,或 WorkManager 保证后台任务完成。动态注册 BroadcastReceiver 应在 onResume 中 register,onPause 中 unregister,避免内存泄漏;选用 Application Context 可延长生命周期,但需注意匿名的 BroadcastReceiver 内部类会持有 Activity 引用。

可能追问:

  • Android 12 的“精确闹钟”权限对保活的影响?
  • 如果需要在后台接收开机广播,静态注册和动态注册如何选择?
  • WorkManager 的 Guaranteed Execution 机制原理?
避坑提醒:不要使用 1 像素 Activity、循环唤醒锁等黑科技,现在会被 Google Play 拒绝或系统自动杀死。前台服务通知必须保留,否则 Android 14+ 会直接杀死进程。

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
核心难点
  • 横竖屏切换时录制页面 Activity 重建导致视频中断
  • Fragment 间实时通信(音乐列表页与播放控制页)
  • 后台播放音乐在 Android 12+ 被系统限制
  • 动态注册广播接收网络变化,减少电量消耗
面试高频追问
  • 录制页面如何处理旋转重建?——使用 configChanges 禁止重建,手动处理 orientation
  • Fragment 通信如何避免泄漏?——共享 ViewModel + 监听 Lifecycle
  • 后台播放是否被系统杀死?——前台服务 + 媒体通知保持高优先级
  • 网络广播注册在哪个 Context?——Application Context 避免 Activity 泄漏
可迁移回答话术
  • “在处理屏幕旋转时,我采用了 configChanges 配合 onConfigurationChanged 手动布局调整,避免了 Activity 重建导致录制中断,同时使用 ViewModel 保存录制状态”
  • “为了后台播放合规,我使用前台服务并绑定媒体通知,通过 startForeground 告知系统,同时利用 MediaSession 处理多媒体按键”
  • “动态注册广播时,我统一在 Application 的 onCreate 中注册,避免多个 Activity 重复注册,并定期检查注册状态”
课程小结:四大组件面试重在理解生命周期场景 + 数据流 + 合规限制。Activity 强调配置变更和 ViewModel 恢复;Fragment 强调共享 ViewModel 通信;Service 和 Broadcast 强调高版本适配。将项目中的实际处理方案绑定到问题中,能显著提升面试说服力。