Fragment生命周期

这篇文章主要介绍fragment的生命周期而不是用法。

由于fragment不是独立的组件,需要被添加到Acitvity中,所以Fragment的生命周期和Activity存在一定的关联

和fragment生命周期有关的的几个重要回调方法:

onAttach(Activity)  fragment被添加到activity时被调用

onCreate(Bundle)  fragment创建时调用

onCreateView(LayoutInflater, ViewGroup, Bundle)  fragment初始化界面时调用

onActivityCreated(Bundle) 包含fragment的activity的onCreate方法执行完毕后调用

onStart()  fragment可见时,和activitiy的onStart相关联

onResume()  和activitiy的onResume相关联

onPause()  activity onPause或者fragment被移除时

onStop()  activity onStop或者fragment被移除时

onDestroyView() fragment被移除时,关联的view正在被移除时调用

onDestroy(),onDetach() fragment被移除时调用

API GUIDE给出的图示:

Fragment生命周期_第1张图片

还有1个示意图对比了activity和fragment的生命周期


可以看出,fragment的onAttatch,onCreate,onCreateView,onActivityCreated是fragment的创建阶段,相当于Activity的创建阶段,onStart,onResume,onPause,onStop的流程都和Activity一样,销毁阶段,包含了onDestroyView,onDestroy,onDetach方法。

下面用例子来演示fragment的生命周期:

初次启动的Activity:

MainActivity.java

[java] view plaincopy
  1. public class MainActivity extends Activity {  
  2.       
  3.     private Button goFragment;  
  4.     private Button goActivity;  
  5.     private boolean first = true;  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_main);  
  11.         Log.v("test""Activity-onCreate");  
  12.         initViews();  
  13.     }  
  14.       
  15.     @Override  
  16.     protected void onResume() {  
  17.         super.onResume();  
  18.         Log.v("test""Activity-onResume");  
  19.     }  
  20.   
  21.     @Override  
  22.     protected void onPause() {  
  23.         super.onPause();  
  24.         Log.v("test""Activity-onPause");  
  25.     }  
  26.   
  27.     @Override  
  28.     protected void onStop() {  
  29.         super.onStop();  
  30.         Log.v("test""Activity-onStop");  
  31.     }  
  32.   
  33.     @Override  
  34.     protected void onDestroy() {  
  35.         super.onDestroy();  
  36.         Log.v("test""Activity-onDestroy");  
  37.     }  
  38.   
  39.     private void initViews() {  
  40.         goFragment = (Button) findViewById(R.id.go_fragment);  
  41.         goActivity = (Button) findViewById(R.id.go_activity);  
  42.         goFragment.setOnClickListener(new OnClickListener() {  
  43.               
  44.             @Override  
  45.             public void onClick(View v) {  
  46.                 FragmentManager fm = getFragmentManager();  
  47.                 FragmentTransaction ft = fm.beginTransaction();  
  48.                 ft.replace(R.id.container, new FragmentB());  
  49.                 ft.commit();  
  50.             }  
  51.         });  
  52.           
  53.         goActivity.setOnClickListener(new OnClickListener() {  
  54.               
  55.             @Override  
  56.             public void onClick(View v) {  
  57.                 startActivity(new Intent(MainActivity.this, Activity2.class));  
  58.             }  
  59.         });  
  60.     }  
  61.   
  62.     @Override  
  63.     protected void onStart() {  
  64.         Log.v("test""Activity-onStart");  
  65.         super.onStart();  
  66.         //防止重复加载fragment  
  67.         if(first) {  
  68.             first = false;  
  69.             FragmentManager fm = getFragmentManager();  
  70.             FragmentTransaction ft = fm.beginTransaction();  
  71.             ft.add(R.id.container, new FragmentA());  
  72.             ft.commit();  
  73.         }  
  74.     }  
  75. }  

布局文件:

[java] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:gravity="center_horizontal"  
  6.     android:orientation="vertical"  
  7.     tools:context=".MainActivity" >  
  8.       
  9.     <FrameLayout  
  10.         android:id="@+id/container"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="350dp"  
  13.         />  
  14.     <Button  
  15.         android:id="@+id/go_fragment"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:text="go fragment2" />  
  19.     <Button  
  20.         android:id="@+id/go_activity"  
  21.         android:layout_width="wrap_content"  
  22.         android:layout_height="wrap_content"  
  23.         android:text="go Activity2" />  
  24.   
  25. </LinearLayout>  
界面上一个frameLayout,用来装载fragment,2个按钮,一个用来替换fragment,一个用来跳转activity

FragmentA的代码:

[java] view plaincopy
  1. public class FragmentA extends Fragment {  
  2.   
  3.     @Override  
  4.     public void onAttach(Activity activity) {  
  5.         super.onAttach(activity);  
  6.         Log.v("test""FragmentA:" + "onAttach");  
  7.     }  
  8.   
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         Log.v("test""FragmentA:" + "onCreate");  
  13.     }  
  14.   
  15.     @Override  
  16.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  17.             Bundle savedInstanceState) {  
  18.         Log.v("test""FragmentA:" + "onCreateView");  
  19.           
  20.         return inflater.inflate(R.layout.fragment1, null);  
  21.     }  
  22.   
  23.     @Override  
  24.     public void onActivityCreated(Bundle savedInstanceState) {  
  25.         super.onActivityCreated(savedInstanceState);  
  26.         Log.v("test""FragmentA:" + "onActivityCreated");  
  27.     }  
  28.   
  29.     @Override  
  30.     public void onStart() {  
  31.         super.onStart();  
  32.         Log.v("test""FragmentA:" + "onStart");  
  33.     }  
  34.   
  35.     @Override  
  36.     public void onResume() {  
  37.         super.onResume();  
  38.         Log.v("test""FragmentA:" + "onResume");  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onPause() {  
  43.         super.onPause();  
  44.         Log.v("test""FragmentA:" + "onPause");  
  45.     }  
  46.   
  47.     @Override  
  48.     public void onStop() {  
  49.         super.onStop();  
  50.         Log.v("test""FragmentA:" + "onStop");  
  51.     }  
  52.   
  53.     @Override  
  54.     public void onDestroyView() {  
  55.         super.onDestroyView();  
  56.         Log.v("test""FragmentA:" + "onDestroyView");  
  57.     }  
  58.   
  59.     @Override  
  60.     public void onDestroy() {  
  61.         super.onDestroy();  
  62.         Log.v("test""FragmentA:" + "onDestroy");  
  63.     }  
  64.   
  65.     @Override  
  66.     public void onDetach() {  
  67.         super.onDetach();  
  68.         Log.v("test""FragmentA:" + "onDetach");  
  69.     }  
  70. }  
Activity和fragment的回调中都进行了日志打印。

在Acitivity的onStart方法中,调用了如下代码:

[java] view plaincopy
  1. FragmentManager fm = getFragmentManager();  
  2. FragmentTransaction ft = fm.beginTransaction();  
  3. ft.add(R.id.container, new FragmentA());  
  4. ft.commit();  
作用是在Acitivity启动后在界面上加载一个fragment。

启动程序,观察控制台输出:

[html] view plaincopy
  1. 10-27 18:20:23.423: V/test(3128): Activity-onCreate  
  2. 10-27 18:20:23.423: V/test(3128): Activity-onStart  
  3. 10-27 18:20:23.423: V/test(3128): FragmentA:onAttach  
  4. 10-27 18:20:23.423: V/test(3128): FragmentA:onCreate  
  5. 10-27 18:20:23.423: V/test(3128): FragmentA:onCreateView  
  6. 10-27 18:20:23.423: V/test(3128): FragmentA:onActivityCreated  
  7. 10-27 18:20:23.423: V/test(3128): FragmentA:onStart  
  8. 10-27 18:20:23.423: V/test(3128): Activity-onResume  
  9. 10-27 18:20:23.423: V/test(3128): FragmentA:onResume  

解释:MainActivity onCreate执行后,接着执行onStart,onStart中添加了fragment到framelayout中,这时fragment的onAttach回调被调用。接着是onCreate,onCreateView,onActivityCreated依次被回调,现在点击gofragment2按钮,移除fragment1,加入fragment2,观察logcat:

[html] view plaincopy
  1. 10-27 18:44:23.513: V/test(3128): FragmentA:onPause  
  2. 10-27 18:44:23.513: V/test(3128): FragmentA:onStop  
  3. 10-27 18:44:23.513: V/test(3128): FragmentA:onDestroyView  
  4. 10-27 18:44:23.513: V/test(3128): FragmentA:onDestroy  
  5. 10-27 18:44:23.513: V/test(3128): FragmentA:onDetach  
正是第一张图片所示的从前台到销毁的过程。

现在重启程序,试着点击第二个按钮go Activity2,观察logcat输出:

[html] view plaincopy
  1. 10-27 19:08:34.253: V/test(3128): FragmentA:onPause  
  2. 10-27 19:08:34.253: V/test(3128): Activity-onPause  
  3. 10-27 19:08:34.573: V/test(3128): FragmentA:onStop  
  4. 10-27 19:08:34.573: V/test(3128): Activity-onStop  

可以看到,当前Activity被覆盖后,fragment的onPause,onStop和Activity的onPause,onStop同时被调用。

这时,按物理返回键,退出第二个Activity,回到第一个Activity,观察logcat输出:

[html] view plaincopy
  1. 10-27 19:29:07.063: V/test(9162): Activity-onStart  
  2. 10-27 19:29:07.063: V/test(9162): FragmentA:onStart  
  3. 10-27 19:29:07.063: V/test(9162): Activity-onResume  
  4. 10-27 19:29:07.063: V/test(9162): FragmentA:onResume  
可见,在activity重新进入前台,执行onStart和onResume时,fragment也执行一样的操作

现在修改一下跳转activity的按钮的代码,让当前activity finish

[java] view plaincopy
  1. goActivity.setOnClickListener(new OnClickListener() {  
  2.       
  3.     @Override  
  4.     public void onClick(View v) {  
  5.         startActivity(new Intent(MainActivity.this, Activity2.class));  
  6.         finish();  
  7.     }  
  8. });  
重启程序,点击跳转activity的按钮,观察输出:

[html] view plaincopy
  1. 10-27 19:33:54.893: V/test(9810): FragmentA:onPause  
  2. 10-27 19:33:54.893: V/test(9810): Activity-onPause  
  3. 10-27 19:33:55.213: V/test(9810): FragmentA:onStop  
  4. 10-27 19:33:55.213: V/test(9810): Activity-onStop  
  5. 10-27 19:33:55.213: V/test(9810): FragmentA:onDestroyView  
  6. 10-27 19:33:55.213: V/test(9810): FragmentA:onDestroy  
  7. 10-27 19:33:55.213: V/test(9810): FragmentA:onDetach  
  8. 10-27 19:33:55.213: V/test(9810): Activity-onDestroy  


原文地址:http://blog.csdn.net/oHeHeHou/article/details/13168791

你可能感兴趣的:(Fragment)