Fragment 生命周期解惑

2020-09-19  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读