返回

字节一面试题:Fragment生命周期大起底

Android

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 生命周期阶段的正确顺序为:

  1. Activity.onCreate()
  2. Fragment.onAttach()
  3. Fragment.onCreate()
  4. Fragment.onCreateView()
  5. Fragment.onActivityCreated()
  6. Activity.onStart()
  7. Fragment.onStart()
  8. Fragment.onResume()
  9. 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 开发的深入理解。

常见问题解答

  1. Fragment 的 onCreateView() 和 onActivityCreated() 方法有什么区别?
    • onCreateView() 创建 Fragment 的用户界面,而 onActivityCreated() 在 Fragment 与 Activity 关联后立即触发。
  2. Fragment 的 onStart() 和 onResume() 方法有什么区别?
    • onStart() 在 Fragment 变为可见时触发,而 onResume() 在 Fragment 获得焦点时触发。
  3. Fragment 的 onPause() 和 onStop() 方法有什么区别?
    • onPause() 在 Fragment 失去焦点时触发,而 onStop() 在 Fragment 不再可见时触发。
  4. Fragment 何时被销毁?
    • 当 Fragment 所在的 Activity 被销毁时,或者当 Fragment 被显式移除时,Fragment 都会被销毁。
  5. 如何管理 Fragment 的生命周期?
    • 使用 Fragment 生命周期方法,例如 onStart()、onStop() 和 onDestroyView() 来管理 Fragment 的状态和行为。