美文网首页
Fragment 生命周期解惑

Fragment 生命周期解惑

作者: 你可记得叫安可 | 来源:发表于2020-09-19 16:08 被阅读0次

    以下都是基于 androidx.fragment:fragment:1.2.4 分析

    正常加载

    onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume

    正常退出

    onPause -> onStop -> onDestroyView -> onDestroyView -> onDestroy -> onDetach

    注意到加载时有 onActivityCreated 但是退出时却没有 onActivityDestroyed。这个生命周期为什么表现出不对称性?原因是这个 1.2.4 版本的 Fragment 还处于改进中,在之后的 1.3.0 版本中,onActivityCreated 将被标记为 Deprecated。和 View 相关的代码应写在 onCreateView 中,其他的初始化代码应写在 onCreate 中。如果确实关心 Activity 的生命周期,应该在 onAttach 中注册 LifecyclerObserver 来观察 Activity 的生命周期。release note: fragment#1.3.0-alpha02

    class MyFragment : Fragment(), LifecycleObserver {
       @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
       fun onCreated(){
           activity?.lifecycle?.removeObserver(this)
       }
    
       override fun onAttach(context: Context) {
           super.onAttach(context)
           activity?.lifecycle?.addObserver(this)
       }
    }
    

    旋转屏幕时

    onPuase -> onStop -> onSavedInstanceState -> onDestroyView -> onDestroy -> onDetach -> 正常加载流程

    • 如果 Activity 没有配置 android:configChanges,那么屏幕旋转时,ActivityFragment 都会经过销毁和重建的过程。在销毁时,由于可能被重建,因此会调用 onSavedInstanceState 来保存状态(退出时就不会调用,因为退出时不需要保存状态)。之所以旋转屏幕要销毁和重建,主要是为了让开发者有机会在横屏时重新加载横屏时的布局(通过布局的 land 维度)。
      如果配置了 android:configChanges='orientation|screenSize',那么就表示开发者自己处理横屏的情况,不需要销毁、重建 ActivityFragment。此时系统会回调 Activity.onConfigurationChanged()Fragment.onConfigurationChanged(),传递 Configuration 对象,开发者根据该对象中新的设备配置信息,自己决定对资源进行适当修改。

    • 上面的 onSavedInstanceState 主要用于保存销毁时必要的信息,这样可以在重建后的 Fragment 中拿回这些信息。如果使用 ViewModel 的话,由于它自身能够跨越 销毁 - 重建 的生命周期,因此可以不用使用 onSavedInstanceState 方法。

    退回 HOME 页面,再回来

    onPause -> onStop -> onSaveInstanceState

    • 如果 Fragment 没有被销毁,那么再回到 Fragment 时,走 onStart -> onResume 流程。
    • 如果 Fragment 被销毁了,那么再回到 Fragment 时,正常的创建 Fragment 过程,开发者有机会在 onCreateonCreateViewonActivityCreate 时恢复数据

    FragmentActivity 一样有 onSaveInstanceState 回调来保存临时数据,但是却没有 onRestoreInstanceState 来恢复临时数据。Fragment 的数据恢复是在 onCreate(Bundle)onCreateView(LayoutInflater, ViewGroup, Bundle)onActivityCreated(Bundle)(该回调之后会被移除) 中进行恢复的,用于提供给开发者不同的恢复时机。

    相关文章

      网友评论

          本文标题:Fragment 生命周期解惑

          本文链接:https://www.haomeiwen.com/subject/naneyktx.html