关于FragmentManager动态管理Fragment时Fragment生命周期的探究

Posted 杨伟乔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于FragmentManager动态管理Fragment时Fragment生命周期的探究相关的知识,希望对你有一定的参考价值。

Fragment是android中的重要组件,在Android 3.0的时候添加进来。

关于Fragment的生命周期,我相信了解过的开发人员都应该把以下方法脱口而出:onAttach, onCreate, onCreateView, onViewCreated, onActivityCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach.

当Fragment以静态的方式,即通过在布局文件中以其它控件的方式设置时,它的生命周期随所在Activity的生命周期而发生变化。此时其生命周期的方法调用过程是这样的:

1,当首次展示布局页面时,其生命周期方法调用的顺序是:

 

2,而当关闭手机屏幕或者手机屏幕变暗时,其其生命周期方法调用的顺序是:

 

3,当再次对手机屏幕解锁或者手机屏幕变亮时,其生命周期方法调用的顺序是:

 

4,而当对当前Fragment所在屏幕按返回键时,其生命周期方法调用的顺序是:

1 01-13 17:08:46.959    3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onPause

2 01-13 17:08:46.959    3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onStop

3 01-13 17:08:46.959    3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onDestroyView

4 01-13 17:08:46.959    3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onDestroy

5 01-13 17:08:46.959    3102-3102/com.yeepay.fraglifecircletest I/FragA﹕ onDetach
View Code

但是当使用FragmentManager动态的管理Fragment并且涉及到是否addToBackStack时,其生命周期的展现就略微显得有些复杂了。但是还没有复杂到无法理解。

好,下面,我们就探究一下这些问题。

首先,我们重写了两个Fragment,主要是重写了它们的生命周期方法,通过在其生命周期方法中打印出Log的方式来显示其方法的调用。

两个类分别是:

 1 package com.yeepay.fraglifecircletest.frag;

 2 3 import android.app.Activity;

 4 import android.app.Fragment;

 5 import android.os.Bundle;

 6 import android.util.Log;

 7 import android.view.LayoutInflater;

 8 import android.view.View;

 9 import android.view.ViewGroup;

1011 import com.yeepay.fraglifecircletest.R;

1213 public class FragA extends Fragment {14     private static final String TAG = FragA.class.getSimpleName();

1516     @Override17     public void onAttach(Activity activity) {

18         super.onAttach(activity);

19         Log.i(TAG, "onAttach");

20     }

2122     @Override23     public void onCreate(Bundle savedInstanceState) {

24         super.onCreate(savedInstanceState);

25         Log.i(TAG, "onCreate");

26     }

2728     @Override29     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

30         Log.i(TAG, "onCreateView");

31         return inflater.inflate(R.layout.fragment_test_a, null, false);

32     }

3334     @Override35     public void onViewCreated(View view, Bundle savedInstanceState) {

36         Log.i(TAG, "onViewCreated");

37         super.onViewCreated(view, savedInstanceState);

38     }

3940     @Override41     public void onDestroy() {

42         Log.i(TAG, "onDestroy");

43         super.onDestroy();

44     }

4546     @Override47     public void onDetach() {

48         Log.i(TAG, "onDetach");

49         super.onDetach();

50     }

5152     @Override53     public void onDestroyView() {

54         Log.i(TAG, "onDestroyView");

55         super.onDestroyView();

56     }

5758     @Override59     public void在 FragmentManager 中管理 BackStackEntries

UIfragment与fragmentManager

为啥 getFragmentManager 会导致 Incompatible Type 错误? [关闭]

如何避免 FragmentManager 重新创建片段?

Android中FragmentManager进行片段回收的目的是啥?

AsyncTask 和 FragmentManager 的问题