You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:13:25