news 2026/5/25 15:19:13

Android ---【经验篇】Fragment 生命周期高频面试题(附标准答案)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android ---【经验篇】Fragment 生命周期高频面试题(附标准答案)

文章目录

  • 前言
    • 一、基础概念类(必问)
      • 1. Fragment 生命周期有哪些核心阶段?请简述每个阶段的作用
      • 2. onCreateView 和 onViewCreated 的区别?分别适合做什么操作?
    • 二、场景分析类(高频)
      • 1. 屏幕旋转(Configuration 变化)时,Fragment 生命周期会如何变化?如何避免数据丢失?
      • 2. 从 Fragment A 跳转到 Fragment B,A 和 B 的生命周期分别会执行哪些回调?
      • 3. 凌晨限量抢购场景中,Fragment 处理抢购按钮点击后,如何保证生命周期重建后(如切后台再切回)按钮状态不重置?
    • 三、问题排查类(进阶)
      • 1. 为什么 Fragment 中 findViewById 会报空指针?常见原因有哪些?
      • 2. Fragment 出现内存泄漏的常见场景?如何避免?
      • 3. 为什么重写 Fragment 生命周期方法时必须调用 super 方法?不调用会有什么问题?
    • 四、实战优化类(大厂常问)
      • 1. 高并发下单 / 抢购场景中,Fragment 如何优化生命周期回调中的耗时操作?
      • 2. 如何管理多个 Fragment 的生命周期?比如 ViewPager + Fragment 场景下,如何避免预加载导致的性能问题?
    • Fragment 生命周期面试题的核心考察方向:

前言

结合日常开发和面试场景,我为整理了 Fragment 生命周期相关的核心面试题,涵盖基础概念、场景分析、问题排查,适配微信公众号的阅读节奏和答题逻辑:

一、基础概念类(必问)

1. Fragment 生命周期有哪些核心阶段?请简述每个阶段的作用

标准答案:Fragment 生命周期从依附 Activity 到解除关联,核心分为 4 大阶段 + 12 个关键回调,核心阶段如下:
创建阶段:onAttach(关联 Activity)→ onCreate(初始化非视图数据)→ onCreateView(加载布局)→ onViewCreated(初始化控件)→ onActivityCreated(确认 Activity 就绪);
可见 / 交互阶段:onStart(可见)→ onResume(可交互);
暂停 / 不可见阶段:onPause(暂停交互)→ onStop(完全不可见);
销毁阶段:onDestroyView(销毁视图)→ onDestroy(销毁 Fragment)→ onDetach(解除关联)。

2. onCreateView 和 onViewCreated 的区别?分别适合做什么操作?

标准答案:
onCreateView:核心作用是加载并返回 Fragment 的视图布局,仅负责视图的创建,不建议在此做控件初始化(可能因视图未完全加载导致空指针);
onViewCreated:视图创建完成后立即调用,参数直接传入创建好的 View,适合所有与视图相关的操作(如控件 findViewById、设置点击监听、初始化列表数据)。
3. Fragment 与 Activity 生命周期的联动关系?(比如 Activity 执行 onPause,Fragment 会怎样?)
标准答案:Fragment 生命周期完全依赖所属 Activity,联动核心规则:
Activity 执行 onCreate → Fragment 执行 onAttach/onCreate 等创建阶段方法;
Activity 执行 onStart/onResume → Fragment 依次执行 onStart/onResume;
Activity 执行 onPause/onStop → Fragment 先执行 onPause/onStop;
Activity 执行 onDestroy → Fragment 先执行 onDestroyView/onDestroy/onDetach。

二、场景分析类(高频)

1. 屏幕旋转(Configuration 变化)时,Fragment 生命周期会如何变化?如何避免数据丢失?

标准答案:

(1)生命周期变化:
默认情况下,屏幕旋转会导致 Activity 重建 → Fragment 随之销毁并重新创建,流程:onPause → onStop → onDestroyView → onDestroy → onDetach → 重新执行 onAttach → onCreate → … → onResume。

(2)避免数据丢失的方案:
方案 1:利用 onSaveInstanceState 保存临时数据,在 onCreate/onViewCreated 中通过 Bundle 恢复;
方案 2:给 Fragment 设置 setRetainInstance(true),保留 Fragment 实例(仅重建视图,不销毁 Fragment 对象);
方案 3:在 AndroidManifest 中给 Activity 配置 android:configChanges=“orientation|screenSize”,阻止 Activity 重建。

2. 从 Fragment A 跳转到 Fragment B,A 和 B 的生命周期分别会执行哪些回调?

标准答案:(以 replace 方式替换 Fragment 为例)

Fragment A:onPause → onStop → onDestroyView(若未移除实例,不会执行 onDestroy/onDetach);
Fragment B:onAttach → onCreate → onCreateView → onViewCreated → onActivityCreated → onStart → onResume。

3. 凌晨限量抢购场景中,Fragment 处理抢购按钮点击后,如何保证生命周期重建后(如切后台再切回)按钮状态不重置?

标准答案:核心思路是将状态存储在非视图层,生命周期重建后恢复:
在 Fragment 的 onCreate 中初始化抢购状态变量(如 isGrabbed = false),避免依赖视图控件;
点击抢购按钮后,将 isGrabbed 设为 true,并通过 onSaveInstanceState 保存该状态;
在 onViewCreated 中读取保存的状态,恢复按钮状态(如 isGrabbed=true 则按钮置灰、显示 “已抢购”);
进阶方案:将状态同步到 ViewModel(不受生命周期影响),彻底避免重建丢失。

三、问题排查类(进阶)

1. 为什么 Fragment 中 findViewById 会报空指针?常见原因有哪些?

标准答案:核心原因是在视图未创建完成时调用了 findViewById,常见场景:
在 onCreate 中调用(此时 onCreateView 还未执行,视图未加载);
onCreateView 中未正确返回布局(如返回 null);
布局 ID 写错,或控件 ID 与布局文件不匹配;
视图销毁后(如 onDestroyView 后)未清空控件引用,再次调用导致空指针。

2. Fragment 出现内存泄漏的常见场景?如何避免?

标准答案:
(1)常见泄漏场景:
持有 Activity 的强引用(如匿名内部类监听器、Handler 引用 Activity);
onDestroyView 后未解绑控件监听、未取消网络请求 / 定时器;
静态变量引用 Fragment 实例。
(2)避免方案:
使用弱引用(WeakReference)持有 Activity/Fragment;
在 onPause/onDestroyView 中取消网络请求、停止定时器、解绑监听器;
避免静态变量引用 Fragment 实例;
使用 ViewModel 存储数据,代替 Fragment 持有大量数据。

3. 为什么重写 Fragment 生命周期方法时必须调用 super 方法?不调用会有什么问题?

标准答案:
Fragment 的父类(androidx.fragment.app.Fragment)中,super 方法包含系统的核心逻辑(如视图管理、状态保存、与 Activity 的联动);
不调用 super 会导致:生命周期流程异常(如视图无法正常销毁)、状态保存失败、FragmentManager 管理异常,甚至崩溃。

四、实战优化类(大厂常问)

1. 高并发下单 / 抢购场景中,Fragment 如何优化生命周期回调中的耗时操作?

标准答案:核心原则是耗时操作异步化,生命周期回调中仅做轻量操作:
数据请求(如抢购接口、订单查询)放在 onResume 中,并通过协程 / 线程池异步执行,避免阻塞主线程;
在 onPause 中取消未完成的网络请求(如 Retrofit 取消 Call),防止回调触发时 Fragment 已销毁;
抢购按钮的状态更新通过 LiveData/Flow 实现,避免在生命周期回调中频繁更新 UI;
避免在 onCreateView/onViewCreated 中做大量数据解析,可提前在 onCreate 中异步解析。

2. 如何管理多个 Fragment 的生命周期?比如 ViewPager + Fragment 场景下,如何避免预加载导致的性能问题?

标准答案:
(1)ViewPager 预加载问题:
ViewPager 默认预加载左右各 1 个 Fragment,导致未显示的 Fragment 也执行 onStart/onResume,消耗资源。
(2)优化方案:
方案 1:设置 viewPager.setOffscreenPageLimit(0)(部分版本不生效);
方案 2:使用 setUserVisibleHint(旧版)/onResumeFragments(新版)判断 Fragment 是否真正可见,仅在可见时执行耗时操作(如加载数据);
方案 3:使用 ViewPager2 + Lifecycle 感知,通过 Lifecycle.Event.ON_RESUME 结合可见状态触发数据加载。
总结

Fragment 生命周期面试题的核心考察方向:

基础回调的理解与区分(如 onCreateView/onViewCreated);
与 Activity 的联动、配置变化的处理;
实际开发中的问题排查(空指针、内存泄漏);
结合业务场景(如抢购、高并发)的生命周期优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 5:41:04

Open-AutoGLM免Root安装终极指南(仅限高级玩家的隐藏方案)

第一章:Open-AutoGLM免Root使用全景解析Open-AutoGLM 是一款基于轻量级自动化框架设计的智能辅助工具,专为无需 Root 权限的 Android 设备优化。它利用无障碍服务与 Intent 机制实现应用间协同控制,可在不破坏系统安全策略的前提下完成任务自…

作者头像 李华
网站建设 2026/5/26 5:44:04

YOLOv9性能优化与部署实战:从瓶颈诊断到效率跃迁

YOLOv9性能优化与部署实战:从瓶颈诊断到效率跃迁 【免费下载链接】yolov9 项目地址: https://gitcode.com/GitHub_Trending/yo/yolov9 在工业质检、自动驾驶等实时性要求极高的场景中,YOLOv9作为当前最先进的目标检测模型,其原生PyTo…

作者头像 李华
网站建设 2026/5/26 8:41:10

【远程控制新纪元】:基于Open-AutoGLM的WiFi手机操控系统搭建全过程

第一章:远程控制新纪元的开启随着云计算、物联网和5G网络的普及,远程控制技术正迎来前所未有的发展契机。设备间的无缝连接与实时交互已成为现代IT基础设施的核心需求。无论是远程办公、工业自动化,还是智能家居管理,高效的远程控…

作者头像 李华
网站建设 2026/5/26 5:54:52

Dracula主题终极指南:30分钟打造专属深色编程环境

Dracula主题终极指南:30分钟打造专属深色编程环境 【免费下载链接】dracula-theme 🧛🏻‍♂️ One theme. All platforms. 项目地址: https://gitcode.com/gh_mirrors/dr/dracula-theme 你是否厌倦了刺眼的白色编程界面?Dr…

作者头像 李华
网站建设 2026/5/26 3:29:07

第6篇 | OLT:藏在“小黑屋”里的接入网“司令部”

《固定接入网:光纤的“最后一公里”》 第6篇 01. 引子:深夜的“网络悬案”与背后的隐形大佬 先问你一个扎心的问题: 当你在工作日的晚上八九点,正开着重要的视频会议,或者全家人一起刷剧、打游戏时,突然网络开始“转圈圈”,视频卡成了PPT。你第一反应是怪谁? 99% 的…

作者头像 李华
网站建设 2026/5/25 19:50:35

Chipsbank APTool V7200终极指南:U盘量产与修复完整教程

还在为U盘批量生产而烦恼吗?Chipsbank APTool V7200作为专为Chipsbank控制芯片设计的量产工具,为您提供了一站式的解决方案。这款发布于2020年2月21日的专业工具,让U盘的格式化、固件升级和个性化定制变得前所未有的简单高效。 【免费下载链接…

作者头像 李华