为何Fragment.onCreate在Activity.onStart后而非onCreate后调用?
Fragment 生命周期回调顺序疑问:onCreate 为何在 Activity.onStart 之后执行?
我在Activity的onCreate方法中添加Fragment,核心代码如下:
override fun onCreate(savedInstanceState: Bundle?) { Log.d("===Activity: ","onCreate") super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState == null) { supportFragmentManager.commit { add(R.id.main_cv, MainFragment()) setReorderingAllowed(true) addToBackStack(null) } } }
观察到的生命周期回调日志顺序如下:
===Activity:: onCreate ===Activity:: onStart ===Fragment:: onAttach ===Fragment:: onCreate ===Fragment:: onCreateView ===Fragment:: onViewCreated ===Fragment:: onStart
我的疑问是:为什么Fragment的onCreate会在Activity的onStart之后执行,而不是Activity的onCreate之后?
完整代码
Activity 代码
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { Log.d("===Activity: ","onCreate") super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState == null) { supportFragmentManager.commit { add(R.id.main_cv, MainFragment()) setReorderingAllowed(true) addToBackStack(null) } } } override fun onStart() { Log.d("===Activity: ","onStart") super.onStart() } override fun onResume() { Log.d("===Activity: ","onResume") super.onResume() } override fun onPause() { Log.d("===Activity: ","onPause") super.onPause() } override fun onStop() { Log.d("===Activity: ","onStop") super.onStop() } override fun onDestroy() { Log.d("===Activity: ","onDestroy") super.onDestroy() } }
Fragment 代码
class MainFragment : Fragment() { override fun onAttach(context: Context) { Log.d("===Fragment: ","onAttach") super.onAttach(context) } override fun onCreate(savedInstanceState: Bundle?) { Log.d("===Fragment: ","onCreate") super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { Log.d("===Fragment: ","onCreateView") // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_main, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { Log.d("===Fragment: ","onViewCreated") super.onViewCreated(view, savedInstanceState) } override fun onStart() { Log.d("===Fragment: ","onStart") super.onStart() } override fun onResume() { Log.d("===Fragment: ","onResume") super.onResume() } override fun onPause() { super.onPause() Log.d("===Fragment: ","onPause") } override fun onStop() { super.onStop() Log.d("===Fragment: ","onStop") } override fun onDestroyView() { super.onDestroyView() Log.d("===Fragment: ","onDestroyView") } override fun onDestroy() { super.onDestroy() Log.d("===Fragment: ","onDestroy") } }
原因分析
这一现象的核心原因是代码中启用了setReorderingAllowed(true),该API是FragmentManager提供的事务优化特性,会调整Fragment事务的执行时机,以匹配更合理的生命周期依赖逻辑。
在未开启事务重排序时(默认或设为false),Fragment事务会在Activity的onCreate执行完毕后立即同步执行,此时Fragment的生命周期回调会紧跟在Activity.onCreate之后。但开启重排序后,FragmentManager会推迟事务的执行,直到Activity完成自身的onStart回调,确保Fragment在Activity进入活跃状态后再完成初始化流程,以此避免因Activity状态未就绪引发的潜在问题。
这是Jetpack Fragment库的优化设计,目的是让Fragment与Activity的生命周期更协调,减少状态不一致的风险。
若希望Fragment的onCreate在Activity.onCreate之后执行,只需移除setReorderingAllowed(true)配置,此时事务会在Activity.onCreate阶段同步执行,日志顺序将变为:
===Activity:: onCreate ===Fragment:: onAttach ===Fragment:: onCreate ===Fragment:: onCreateView ===Fragment:: onViewCreated ===Activity:: onStart ===Fragment:: onStart
内容的提问来源于stack exchange,提问作者Λnchor
相关产品推荐
相关产品推荐

