返回
字节一面试题:Fragment生命周期大起底
Android
2024-02-13 10:56:12
Fragment 生命周期:面试中必备知识
Fragment 在 Android 开发中广泛应用,它允许我们在一个 Activity 中管理多个屏幕布局。透彻理解 Fragment 的生命周期对于构建健壮且可维护的 Android 应用程序至关重要。本文将深入探讨 Fragment 生命周期,并通过一个真实的字节跳动面试题进行剖析。
Fragment 生命周期阶段
Fragment 的生命周期由以下阶段组成:
- onAttach(): 当 Fragment 与 Activity 建立关联时触发。
- onCreate(): Fragment 被创建时触发。
- onCreateView(): Fragment 的用户界面被创建时触发。
- onActivityCreated(): 在 Activity 的 onCreate() 方法返回后触发。
- onStart(): Fragment 变为可见时触发。
- onResume(): Fragment 获得焦点时触发。
- onPause(): Fragment 失去焦点时触发。
- onStop(): Fragment 不再可见时触发。
- onDestroyView(): Fragment 的用户界面被销毁时触发。
- onDestroy(): Fragment 被销毁时触发。
- onDetach(): Fragment 与 Activity 解除关联时触发。
Activity 和 Fragment 生命周期顺序
在 Activity 中包含一个 Fragment 时,启动 Activity 和 Fragment 时的生命周期阶段顺序如下:
- Activity:
- onCreate()
- onStart()
- onResume()
- Fragment:
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
字节跳动面试题解析
在字节跳动面试中,面试官提出了以下问题:
如果 Activity 中包含一个 Fragment,那么启动 Activity 和 Fragment 时,它们的各自生命周期阶段的顺序是什么?
要回答这个问题,我们需要了解 Fragment 生命周期在 Activity 生命周期中的顺序。从上述生命周期阶段顺序中,我们可以看到:
- Activity 的 onCreate() 方法先于 Fragment 的任何生命周期阶段触发。
- Fragment 的 onAttach()、onCreate()、onCreateView() 和 onActivityCreated() 方法在 Activity 的 onStart() 方法之前触发。
- Fragment 的 onStart() 和 onResume() 方法在 Activity 的 onResume() 方法之后触发。
因此,Activity 和 Fragment 生命周期阶段的正确顺序为:
- Activity.onCreate()
- Fragment.onAttach()
- Fragment.onCreate()
- Fragment.onCreateView()
- Fragment.onActivityCreated()
- Activity.onStart()
- Fragment.onStart()
- Fragment.onResume()
- Activity.onResume()
代码示例
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 添加 Fragment 到 Activity 中
supportFragmentManager.beginTransaction()
.add(R.id.container, MyFragment())
.commit()
}
class MyFragment : Fragment() {
override fun onAttach(context: Context) {
super.onAttach(context)
Log.d("Fragment", "onAttach")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("Fragment", "onCreate")
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_my, container, false)
Log.d("Fragment", "onCreateView")
return view
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
Log.d("Fragment", "onActivityCreated")
}
override fun onStart() {
super.onStart()
Log.d("Fragment", "onStart")
}
override fun onResume() {
super.onResume()
Log.d("Fragment", "onResume")
}
}
运行这段代码,你将在控制台中看到 Fragment 的生命周期阶段在 Activity 生命周期阶段之后输出。
结论
掌握 Fragment 生命周期对于构建稳健且易于维护的 Android 应用程序至关重要。通过透彻理解生命周期阶段的顺序和目的,你可以自信地回答相关面试问题,展示你对 Android 开发的深入理解。
常见问题解答
- Fragment 的 onCreateView() 和 onActivityCreated() 方法有什么区别?
- onCreateView() 创建 Fragment 的用户界面,而 onActivityCreated() 在 Fragment 与 Activity 关联后立即触发。
- Fragment 的 onStart() 和 onResume() 方法有什么区别?
- onStart() 在 Fragment 变为可见时触发,而 onResume() 在 Fragment 获得焦点时触发。
- Fragment 的 onPause() 和 onStop() 方法有什么区别?
- onPause() 在 Fragment 失去焦点时触发,而 onStop() 在 Fragment 不再可见时触发。
- Fragment 何时被销毁?
- 当 Fragment 所在的 Activity 被销毁时,或者当 Fragment 被显式移除时,Fragment 都会被销毁。
- 如何管理 Fragment 的生命周期?
- 使用 Fragment 生命周期方法,例如 onStart()、onStop() 和 onDestroyView() 来管理 Fragment 的状态和行为。