在上一篇博文中对Fragment做了简单的介绍,现在再来探讨一下Fragment的生命周期。
一、Fragment的几种状态:
与Activity类似,Fragment也有一下几种状态:
· 活动状态:当前Fragment位于前台,可见,可获得焦点。
· 暂停状态:其他Activity位于前台,该Fragment可见,不可获得焦点。
· 停止状态:不可见,失去焦点。
· 销毁状态:该Fragment被完全删除或被结束。
二、Fragment的回调方法:
在Fragment的生命周期中,有一下方法会被回调:
· onAttach():当Fragment被添加到Activity时被回调,只回调一次。
· onCreate(Bundle savedStatus):创建Fragment时被回调,一次。
· onCreateView(): 每次创建、绘制该Fragment的View组件时回调,Fragment将会显示该方法返回的View组件。
· onActivityCreated():Fragment所在的Activity启动完成后回调。
· onStart():每次启动或恢复Fragment时被回调。
· onResume():每次启动或恢复Fragment时被回调,onStart()回调后就会回调此方法。
· onPause():暂停时回调。
· onStop():停止Fragment时回调。
· onDestroyView():销毁Fragment的View组件时回调。
· onDestroy():销毁Fragment时调用,一次。
· onDetach():将Fragment从Activity中删除、被替换完成时回到该方法,在onDestroy()之后回调。
根据以上方法被回调的时机,我们可以根据需要选择性的覆盖指定方法。从而实现相关需求。
三、Fragment生命周期实例
下面代码是Fragment生命周期的例子,重写了以上十一个生命周期方法:
1 @SuppressLint("NewApi")
2 public class MyFragment extends Fragment {
3 Button bnOk;
4 TextView tvShow;
5 private final String TAG = "MyFragment";
6
7 public MyFragment(){
8 System.out.println(TAG + ":MyFragment()");
9 }
10
11 @Override
12 public void onAttach(Activity activity) {
13 super.onAttach(activity);
14 System.out.println(TAG + ":onAttach()");
15 }
16
17 @Override
18 public void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 System.out.println(TAG + ":onCreate()");
21
22 }
23 //重写改方法,返回值View将作为Fragment显示的组件
24 @Override
25 public View onCreateView(LayoutInflater inflater, ViewGroup container,
26 Bundle savedInstanceState) {
27 System.out.println(TAG + ":onCreateView()");
28 //加载fragment_main.xml布局文件
29 View rootView = inflater.inflate(R.layout.fragment_main, container, false);
30 return rootView;
31 }
32
33 @Override
34 public void onActivityCreated(Bundle savedInstanceState) {
35 super.onActivityCreated(savedInstanceState);
36 System.out.println(TAG + ":onActivityCreated()");
37 }
38
39 @Override
40 public void onStart() {
41 super.onStart();
42 System.out.println(TAG + ":onStart()");
43 }
44
45 @Override
46 public void onResume() {
47 super.onResume();
48 System.out.println(TAG + ":onResume()");
49 }
50
51 @Override
52 public void onPause() {
53 super.onPause();
54 System.out.println(TAG + ":onPause()");
55 }
56
57 @Override
58 public void onStop() {
59 super.onStop();
60 System.out.println(TAG + ":onStop()");
61 }
62
63 @Override
64 public void onDestroyView() {
65 super.onDestroyView();
66 System.out.println(TAG + ":onDestroyView()");
67 }
68
69 @Override
70 public void onDestroy() {
71 super.onDestroy();
72 System.out.println(TAG + ":onDestroy()");
73 }
74
75 @Override
76 public void onDetach() {
77 super.onDetach();
78 System.out.println(TAG + ":onDetach()");
79 }
80
81 }
下面我们来试验一下并看日志结果:
1、启动Fragment日志如下(请忽略黄色日志):
2、息屏状态下:
3、重新点亮屏幕:
4、退出:
其实还有更多的情况,着这里就不一一试验了。这个例子虽然很简单,但能很好的反映了Fragment生命周期中各方法的回调时机。