一看就懂
仔细观察会发现,与一些文章中所说的顺序不一样 比如下图:
可以看到实测activity 的onStart() 执行在 fragment 的 onAttach()之前。 so,why。
最后可以确定是Android.app.Fragment 与androidx.fragment.app.Fragment的区别。
同时,在调用方式上getSupportFragmentManager()和getFragmentManager() 也存在不同,
用上图所示启动后 生命周期也可以和图里的对应上了,
总结:Google爸爸都建议我们使用新的Fragment,所以面试的时候应该能吹吹逼 。感觉是个能值得注意的点。
更新一下 ChatGPT 的回答:
Q:为什么getSupportFragmentManager()和getFragmentManager() 启动的 fragment 生命周期不一致
ChatGPT A:
在 Android 开发中,getSupportFragmentManager()
和 getFragmentManager()
用于管理 Fragment,但它们的具体用法和适用场景有所不同,这也导致了启动 Fragment 时生命周期表现的不一致。下面我会详细解释这两者之间的差异以及为何会导致生命周期的不一致。
1. getFragmentManager()
与 getSupportFragmentManager()
-
getFragmentManager()
:- 这是
Fragment
类的一个方法,用于获取与当前 Fragment 或 Activity 关联的FragmentManager
。 - 在 Android P(API 级别 28)之前,
getFragmentManager()
被用于从 Activity 或 Fragment 中获取原生FragmentManager
。 - 从 Android 9.0 Pie (API 28) 开始,推荐使用
getSupportFragmentManager()
替代getFragmentManager()
,因为后者已经被废弃。
- 这是
-
getSupportFragmentManager()
:- 这是
FragmentActivity
(和它的子类如AppCompatActivity
)的一个方法,用于获取支持库中的FragmentManager
。 getSupportFragmentManager()
是专门为了支持不同 Android 版本的兼容性而设计的,确保即使在较旧的设备上也能使用 Fragment 的新特性。- 这个方法属于 AndroidX 或早期的 Support Library,用于处理 Fragment 的生命周期和交互。
- 这是
2. 生命周期不一致的原因
-
生命周期管理:
- AndroidX 和 Support Library 中的
FragmentManager
实现了对 Fragment 生命周期的更精细控制。它们经过了优化,以提供更一致和可预测的生命周期事件,尤其是在配置更改(如屏幕旋转)和内存回收场景中。 - 原生的
FragmentManager
(即通过getFragmentManager()
获取的)在早期的 Android 版本中对生命周期事件的管理不如 AndroidX 中的FragmentManager
精细,可能导致生命周期事件在某些情况下触发不一致。
- AndroidX 和 Support Library 中的
-
兼容性和更新:
- AndroidX 库提供了跨 Android 版本的兼容性支持,而原生的
FragmentManager
可能在新旧版本之间存在差异,这种差异可能导致 Fragment 的行为和生命周期管理存在不一致。 - 使用
getSupportFragmentManager()
意味着你的应用将利用最新的库进行构建,这些库通常包含修复、改进和新特性,而这些更新可能没有即时反映到原生 API 中。
- AndroidX 库提供了跨 Android 版本的兼容性支持,而原生的
结论
推荐使用 getSupportFragmentManager()
来管理 Fragment,特别是当你的应用需要支持不同版本的 Android 或者希望利用 AndroidX 提供的最新特性时。这不仅可以确保应用具有更好的兼容性和一致性,还能使得 Fragment 的生命周期管理更加可靠和预测。通过使用最新的 AndroidX 库,开发者可以减少因 Android 版本差异带来的问题,提升应用的整体质量和用户体验。