Fragment生命周期

286 阅读4分钟

上一个Demo, 版本配置:

compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.pudutech.fragmenttest"
        minSdkVersion 27
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    //运行版本:27

MainActivity:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        replaceFragment(FirstFragment())
        switch_fragment_btn.setOnClickListener {
            replaceFragment(SecondFragment())
        }
    }

    private fun replaceFragment(fragment: Fragment) {
        FragmentUtils.replace(
            supportFragmentManager,
            fragment,
            R.id.fragment_container
        )
    }

FragmentUtils.replace方法最终调用

SupportFragmentManager.replace(@IdRes int containerViewId, @NonNull Fragment fragment,
            @Nullable String tag)
SupportFragmentManager.addToBackStack(@Nullable String name)
SupportFragmentManager.commitAllowingStateLoss()

结果如下:


进入首页
2020-03-17 11:37:29.945 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onCreate
2020-03-17 11:37:29.946 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onCreateView
2020-03-17 11:37:29.949 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onViewCreated
2020-03-17 11:37:29.949 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onActivityCreated
2020-03-17 11:37:29.950 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onStart
2020-03-17 11:37:29.956 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onResume

切换fragment
2020-03-17 11:37:48.576 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onCreate
2020-03-17 11:37:48.577 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onPause
2020-03-17 11:37:48.577 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onStop
2020-03-17 11:37:48.577 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onDestroyView
2020-03-17 11:37:48.578 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onCreateView
2020-03-17 11:37:48.579 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onViewCreated
2020-03-17 11:37:48.579 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onActivityCreated
2020-03-17 11:37:48.580 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onStart
2020-03-17 11:37:48.580 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onResume

按back键
2020-03-17 11:38:05.537 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onPause
2020-03-17 11:38:05.537 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onStop
2020-03-17 11:38:05.537 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onDestroyView
2020-03-17 11:38:05.538 5005-5005/com.pudutech.fragmenttest D/SecondFragment: onDestroy
2020-03-17 11:38:05.539 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onCreateView
2020-03-17 11:38:05.540 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onViewCreated
2020-03-17 11:38:05.540 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onActivityCreated
2020-03-17 11:38:05.540 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onStart
2020-03-17 11:38:05.540 5005-5005/com.pudutech.fragmenttest D/FirstFragment: onResume

再次点击back(未退出app,需要再点击才退出)
2020-03-17 11:40:43.215 5143-5143/com.pudutech.fragmenttest D/FirstFragment: onPause
2020-03-17 11:40:43.215 5143-5143/com.pudutech.fragmenttest D/FirstFragment: onStop
2020-03-17 11:40:43.215 5143-5143/com.pudutech.fragmenttest D/FirstFragment: onDestroyView
2020-03-17 11:40:43.216 5143-5143/com.pudutech.fragmenttest D/FirstFragment: onDestroy

修改代码,去掉addToBackStack的调用。 结果如下:

进入首页
2020-03-17 11:48:09.866 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onCreate
2020-03-17 11:48:09.867 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onCreateView
2020-03-17 11:48:09.867 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onViewCreated
2020-03-17 11:48:09.868 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onActivityCreated
2020-03-17 11:48:09.868 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onStart
2020-03-17 11:48:09.873 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onResume

切换fragment
2020-03-17 11:48:14.885 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onCreate
2020-03-17 11:48:14.886 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onPause
2020-03-17 11:48:14.886 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onStop
2020-03-17 11:48:14.887 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onDestroyView
2020-03-17 11:48:14.889 5669-5669/com.pudutech.fragmenttest D/FirstFragment: onDestroy
2020-03-17 11:48:14.890 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onCreateView
2020-03-17 11:48:14.893 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onViewCreated
2020-03-17 11:48:14.893 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onActivityCreated
2020-03-17 11:48:14.893 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onStart
2020-03-17 11:48:14.894 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onResume


点击back键(直接退出app)
2020-03-17 11:48:35.654 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onPause
2020-03-17 11:48:36.202 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onStop
2020-03-17 11:48:36.204 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onDestroyView
2020-03-17 11:48:36.208 5669-5669/com.pudutech.fragmenttest D/SecondFragment: onDestroy

另外,亮灭屏时候fragment的生命周期方法调用顺序为:

2020-03-17 11:58:09.614 8731-8731/com.pudutech.fragmenttest D/SecondFragment: onPause
2020-03-17 11:58:09.651 8731-8731/com.pudutech.fragmenttest D/SecondFragment: onStop

2020-03-17 11:58:12.708 8731-8731/com.pudutech.fragmenttest D/SecondFragment: onStart
2020-03-17 11:58:12.712 8731-8731/com.pudutech.fragmenttest D/SecondFragment: onResume