线上发生了一个神奇的问题: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
总结起来,所有重写的生命周期方法,一定会被调到,所有异常状态都只能在最后一个重写的方法中处理。