Fragment依赖于Activity,生命周期与Activity的类似。
六个状态
static final int INITIALIZING = 0; // Not yet created.
static final int CREATED = 1; // Created.
static final int ACTIVITY_CREATED = 2; // activity完成创建
static final int STOPPED = 3; // created, not started.
static final int STARTED = 4; // not resumed.
static final int RESUMED = 5; // resumed.
FragmentManager#moveToState方法。
void moveToState(Fragment f, int newState, int transit, int
transitionStyle,boolean keepActive) {
if (f.mState < newState) {
switch (f.mState) {//创建与初始化
case Fragment.INITIALIZING:
case Fragment.CREATED:
case Fragment.ACTIVITY_CREATED:
case Fragment.STOPPED:
case Fragment.STARTED:
}
} else if (f.mState > newState) {
switch (f.mState) {//暂停或销毁
case Fragment.RESUMED:
case Fragment.STARTED:
case Fragment.STOPPED:
case Fragment.ACTIVITY_CREATED:
case Fragment.CREATED:
}
}
}
比较Fragment当前mState和新newState状态。
- 若新newState大于mState,Fragment创建与初始化。
- 若新newState小于mState,Fragment暂停或销毁。
- 状态转换过程触发一系列生命周期方法。
启动生命周期
Fragment创建启动生命周期。 Fragment创建启动生命周期.jpg1,INITIALIZING->CREATED
Fragment还未初始化。
Fragment#onAttach方法。
public void onAttach(Context context) {
mCalled = true;
final Activity hostActivity =
mHost == null ? null : mHost.getActivity();
if (hostActivity != null) {
mCalled = false;
onAttach(hostActivity);
}
}
mHost是FragmentHostCallback类型,在onAttach执行前赋值。获取依附的Activity,触发Fragment#onAttach方法。
Fragment#performCreate方法。
void performCreate(Bundle savedInstanceState) {
...
mState = CREATED;
mCalled = false;
onCreate(savedInstanceState);
if (!mCalled) {
throw new SuperNotCalledException("Fragment " + this
+ " did not call through to super.onCreate()");
}
}
触发onCreate,在onCreate会判断恢复savedInstanceState。
Fragment#onCreate方法。
public void onCreate(@Nullable Bundle savedInstanceState) {
mCalled = true;
restoreChildFragmentState(savedInstanceState);
if (mChildFragmentManager != null
&& !mChildFragmentManager.isStateAtLeast(Fragment.CREATED)) {
mChildFragmentManager.dispatchCreate();
}
}
2,CREATED->ACTIVITY_CREATED
Fragment已经完成了初始化,这一步完成视图创建。
依次触发:onCreateView,onViewCreated,onActivityCreated
Fragment#performCreateView方法
View performCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
..
return onCreateView(inflater, container, savedInstanceState);
}
默认onCreateView返回空,需重写onCreateView方法,创建视图,赋值给f.mView。
Fragment#onViewCreated方法是空方法,子类中可重写,初始化控件资源。
Fragment#performActivityCreated方法。
void performActivityCreated(Bundle savedInstanceState) {
..
mState = ACTIVITY_CREATED;
mCalled = false;
onActivityCreated(savedInstanceState);
if (!mCalled) {
throw new SuperNotCalledException("Fragment " + this
+ " did not call through to super.onActivityCreated()");
}
...
}
触发onActivityCreated,将mCalled设置为true,子类重写该方法。
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
mCalled = true;
}
3,ACTIVITY_CREATED->STOPPED
activity完成创建。
case Fragment.ACTIVITY_CREATED:
if (newState > Fragment.ACTIVITY_CREATED) {
f.mState = Fragment.STOPPED;
}
4,STOPPED->STARTED
完全创建完成,还未start。
case Fragment.STOPPED:
if (newState > Fragment.STOPPED) {
f.performStart();
}
Fragment开始可见。
Fragment#performStart方法。
void performStart() {
...
mState = STARTED;
mCalled = false;
onStart();
if (!mCalled) {//抛出异常
}
...
}
触发onStart,将mCalled设置为true,子类可重写该方法。
5,STARTED->RESUMED
case Fragment.STARTED:
if (newState > Fragment.STARTED) {
f.performResume();
f.mSavedFragmentState = null;
f.mSavedViewState = null;
}
活动状态,可交互。
Fragment#performResume方法。
void performResume() {
...
mState = RESUMED;
mCalled = false;
onResume();
if (!mCalled) {//抛出异常
}
..
}
触发onResume方法,将mCalled设置为true,子类可重写该方法。
RESUMED状态
活动状态。
销毁生命周期
Fragment销毁生命周期。 Fragment销毁生命周期.jpg1,RESUMED->STARTED
case Fragment.RESUMED:
if (newState < Fragment.RESUMED) {
f.performPause();
}
使Fragment处于暂停状态,可见,无法交互。
Fragment#performPause方法。
void performPause() {
...
mState = STARTED;
mCalled = false;
onPause();
if (!mCalled) {//抛出异常
}
}
触发Fragment#onPause,将mCalled设置为true,子类可重写该方法。
2,STARTED->STOPPED
case Fragment.STARTED:
if (newState < Fragment.STARTED) {
f.performStop();
}
使Fragment不可见。
Fragment#performStop方法
void performStop() {
...
mState = STOPPED;
mCalled = false;
onStop();
if (!mCalled) {//抛出异常
}
}
触发Fragment#onStop方法,将mCalled设置为true,子类可重写该方法。
3,STOPPED->ACTIVITY_CREATED
case Fragment.STOPPED:
if (newState < Fragment.STOPPED) {
f.performReallyStop();
}
4,,ACTIVITY_CREATED->CREATED
Fragment#performDestroyView方法。
void performDestroyView() {
...
mState = CREATED;
mCalled = false;
onDestroyView();
....
}
销毁与Fragment有关的视图,但未与Activity解除绑定。
触发Fragment#onDestroyView方法。
5,CREATED->INITIALIZING
Fragment#performDestroy方法。
void performDestroy() {
....
mState = INITIALIZING;
mCalled = false;
onDestroy();
....
}
销毁Fragment,触发onDestory方法。
Fragment#performDetach方法。
解除与Activity绑定,触发onDetach方法。
生命周期方法总结
onAttach,onCreate,onCreateView,onViewCreated,onActivityCreated,onStart,onResume
onPause,onStop,onDestoryView,onDestory,onDetach。
任重而道远
网友评论