Fragment生命周期主要体现在以下表中13个方法里,以下是按照Fragment从开始到销毁的先后执行顺序排序。
序号 |
方法名称 |
描述 |
1 |
public void onInflate(Activity activity, AttributeSet attrs,BundlesavedInstanceState) |
在Activity.onCreate方法之前调用,可以获取除了View之外的资源 |
2 |
public void onAttach(Activity activity) |
当fragment第一次与Activity产生关联时就会调用,以后不再调用 |
3 |
public void onCreate(Bundle savedInstanceState) |
在onAttach执行完后会立刻调用此方法,通常被用于读取保存的状态值,获取或者初始化一些数据,但是该方法不执行,窗口是不会显示的,因此如果获取的数据需要访问网络,最好新开线程。 |
4 |
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) |
作用:创建Fragment中显示的view,其中inflater用来装载布局文件,container表示<fragment>标签的父标签对应的ViewGroup对象,savedInstanceState可以获取Fragment保存的状态 |
5 |
public void onViewCreated(View view, Bundle savedInstanceState) |
继上面后就会调用此方法 |
6 |
public void onActivityCreated(Bundle savedInstanceState) |
在Activity.onCreate方法调用后会立刻调用此方法,表示窗口已经初始化完毕,此时可以调用控件了 |
7 |
public void onStart() |
开始执行与控件相关的逻辑代码,如按键点击 |
8 |
public void onResume() |
这是Fragment从创建到显示的最后一个回调的方法 |
9 |
public void onPause() |
当发生界面跳转时,临时暂停,暂停时间是500ms,0.5s后直接进入下面的onStop方法 |
10 |
public void onStop() |
当该方法返回时,Fragment将从屏幕上消失 |
11 |
public void onDestroyView() |
当fragment状态被保存,或者从回退栈弹出,该方法被调用 |
12 |
public void onDestroy() |
当Fragment不再被使用时,如按返回键,就会调用此方法 |
13 |
public void onDetach() |
Fragment生命周期的最后一个方法,执行完后将不再与Activity关联,将释放所有fragment对象和资源 |
下面进行一个demo来观察fragment生命周期,
(1)从启动到显示整个界面:
点击跳转到第二个Actvity时的情况——
可以看到,依次调用onPause() 和 onStop()方法;观察其时间,可以发现就是相差500ms ;
当再次返回到这两个fragment时
当点击返回键,直接回到主界面时,可以看到fragment销毁并退出了
至此,Fragment的生命周期一览无余。
代码如下:
public class MyFragment1 extends Fragment { private Button button1; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("Fragment1", "onCreateView"); View view = inflater.inflate(R.layout.my_fragment1, null); Log.d("Fragment1_onCreateView_getActivity_edittext1", String.valueOf(getActivity().findViewById(R.id.edittext1))); Log.d("Fragment1_onCreateView_view_edittext1", String.valueOf(view.findViewById(R.id.edittext1))); button1 = (Button)view.findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(getActivity(), MainActivity.class); startActivity(intent); } }); return view; } @Override public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { Log.d("Fragment1", "onInflate"); Log.d("Fragment1_onInflate_activity_stringResource", activity .getResources().getString(R.string.app_name)); Log.d("Fragment1_onInflate_class", attrs.getAttributeValue(null, "class")); Log.d("Fragment1_onInflate_getActivity", String.valueOf(getActivity())); Log.d("Fragment1_onInflate_activity_edittext1", String.valueOf(activity.findViewById(R.id.edittext1))); Log.d("Fragment1_onInflate_savedInstanceState", String.valueOf(savedInstanceState)); super.onInflate(activity, attrs, savedInstanceState); } @Override public void onAttach(Activity activity) { Log.d("Fragment1", "onAttach"); Log.d("Fragment1_onAttach_activity_edittext1", String.valueOf(activity.findViewById(R.id.edittext1))); Log.d("Fragment1_onAttach_getActivity_edittext1", String.valueOf(getActivity().findViewById(R.id.edittext1))); super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { Log.d("Fragment1", "onCreate"); Log.d("Fragment1_onCreate_getActivity", String.valueOf(getActivity())); super.onCreate(savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { Log.d("Fragment1", "onViewCreated"); Log.d("Fragment1_onViewCreated_getActivity_edittext1", String.valueOf(getActivity().findViewById(R.id.edittext1))); Log.d("Fragment1_onViewCreated_view_edittext1", String.valueOf(view.findViewById(R.id.edittext1))); super.onViewCreated(view, savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { Log.d("Fragment1", "onActivityCreated"); Log.d("Fragment1_onActivityCreated_getActivity_edittext1", String.valueOf(getActivity().findViewById(R.id.edittext1))); super.onActivityCreated(savedInstanceState); } @Override public void onStart() { Log.d("Fragment1", "onStart"); super.onStart(); } @Override public void onResume() { Log.d("Fragment1", "onResume"); super.onResume(); } @Override public void onPause() { Log.d("Fragment1", System.currentTimeMillis()+"onPause"); super.onPause(); } @Override public void onStop() { Log.d("Fragment1", System.currentTimeMillis()+"onStop"); super.onStop(); } @Override public void onDestroyView() { Log.d("Fragment1", "onDestroyView"); super.onDestroyView(); } @Override public void onDestroy() { Log.d("Fragment1", System.currentTimeMillis()+"onDestroy"); super.onDestroy(); } @Override public void onDetach() { Log.d("Fragment1", "onDetach"); super.onDetach(); } }
使用Fragmen的好处就是可以把业务逻辑和UI封装在一起,与外部关联系不大,其他程序也可以用该组件,从而实现复用最大化。
Fragment 整个生命周期演示,布布扣,bubuko.com
原文地址:http://blog.csdn.net/linfeng24/article/details/26491407