Fragment生命周期的奇怪设定

线上发生了一个神奇的问题:fragment在onCreate的时候初始化数据,判断异常并finishActivity。然而居然走到了onViewCreated…
原因是Fragment的生命周期的调用关系跟臆想的不一样。在FragmentManager内部,Fragment会有几个[状态](http://grepcode.com/file/repo1.maven.org/maven2/com.google.android/support-v4/r7/android/support/v4/app/Fragment.java#Fragment.0INITIALIZING):

     static final int INITIALIZING = 0;     // Not yet created.
     static final int CREATED = 1;          // Created.
     static final int ACTIVITY_CREATED = 2; // The activity has finished its creation.
     static final int STOPPED = 3;          // Fully created, not started.
     static final int STARTED = 4;          // Created and started, not resumed.
     static final int RESUMED = 5;          // Created started and resumed.

这些状态的转换过程中会调用Fragment的生命周期方法。如果在同一个状态下调用的方法,不会因为Activity#finish的调用而导致后续方法不被调用。
神奇的是,状态可能一次跳转多次,所以很可能从起始态一路狂奔到中间态。比如从INITIALIZING一路干到STARTED。
更神奇的是,销毁状态是靠回滚state完成的。

创建过程中状态对应的方法:

  • INITIALIZING:onAttach、onCreate、onCreateView、onViewCreated
  • CREATED:onCreateView、onViewCreated、onActivityCreated
  • ACTIVITY_CREATED、STOPPED:onStart
  • STARTED:onResume

销毁过程中状态对应的方法:
- RESUMED:onPause
- STARTED:onStop
- ACTIVITY_CREATED:onDestroyView
- CREATED:onDestory、onDetach

总结起来,所有重写的生命周期方法,一定会被调到,所有异常状态都只能在最后一个重写的方法中处理。

猜你喜欢

转载自blog.csdn.net/pouloghost/article/details/77233119