【Android 开发教程】Fragment的生命周期

时间:2022-08-10 09:03:49

本章节翻译自《Beginning-Android-4-Application-Development》,如有翻译不当的地方,敬请指出。

原书购买地址http://www.amazon.com/Beginning-Android-4-Application-Development/dp/1118199545/


就像activities一样,fragments也有它们自己的生命周期。理解fragments的生命周期,可以使你在它们被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态。下面的例子测试了fragments的不同状态。

1. 创建一个Fragment的子类:Fragment1.java。

[java] view plaincopy
  1. public class Fragment1 extends Fragment {  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.             Bundle savedInstanceState) {  
  5.   
  6.         Log.d("Fragment 1""onCreateView");  
  7.   
  8.         // ---Inflate the layout for this fragment---  
  9.         return inflater.inflate(R.layout.fragment1, container, false);  
  10.     }  
  11.   
  12.     @Override  
  13.     public void onAttach(Activity activity) {  
  14.         super.onAttach(activity);  
  15.         Log.d("Fragment 1""onAttach");  
  16.     }  
  17.   
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         Log.d("Fragment 1""onCreate");  
  22.     }  
  23.   
  24.     @Override  
  25.     public void onActivityCreated(Bundle savedInstanceState) {  
  26.         super.onActivityCreated(savedInstanceState);  
  27.         Log.d("Fragment 1""onActivityCreated");  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onStart() {  
  32.         super.onStart();  
  33.         Log.d("Fragment 1""onStart");  
  34.     }  
  35.   
  36.     @Override  
  37.     public void onResume() {  
  38.         super.onResume();  
  39.         Log.d("Fragment 1""onResume");  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onPause() {  
  44.         super.onPause();  
  45.         Log.d("Fragment 1""onPause");  
  46.     }  
  47.   
  48.     @Override  
  49.     public void onStop() {  
  50.         super.onStop();  
  51.         Log.d("Fragment 1""onStop");  
  52.     }  
  53.   
  54.     @Override  
  55.     public void onDestroyView() {  
  56.         super.onDestroyView();  
  57.         Log.d("Fragment 1""onDestroyView");  
  58.     }  
  59.   
  60.     @Override  
  61.     public void onDestroy() {  
  62.         super.onDestroy();  
  63.         Log.d("Fragment 1""onDestroy");  
  64.     }  
  65.   
  66.     @Override  
  67.     public void onDetach() {  
  68.         super.onDetach();  
  69.         Log.d("Fragment 1""onDetach");  
  70.     }  
  71. }  
2. 按Ctrl+F11,将模拟器转换成“横屏模式”。

3. 按F11调试。

4. 当应用被加载的时候,LogCat窗口中有如下显示。

[plain] view plaincopy
  1. 03-27 12:23:32.255: D/Fragment 1(704): onAttach  
  2. 03-27 12:23:32.255: D/Fragment 1(704): onCreate  
  3. 03-27 12:23:32.255: D/Fragment 1(704): onCreateView  
  4. 03-27 12:23:32.274: D/Fragment 1(704): onActivityCreated  
  5. 03-27 12:23:32.274: D/Fragment 1(704): onStart  
  6. 03-27 12:23:32.286: D/Fragment 1(704): onResume  
5. 按Home键,LogCat窗口中有如下显示。 [plain] view plaincopy
  1. 03-27 12:25:23.174: D/Fragment 1(704): onPause  
  2. 03-27 12:25:25.174: D/Fragment 1(704): onStop  
6.按Home键不放,重新进入应用,LogCat窗口中有如下显示。 [plain] view plaincopy
  1. 03-27 12:26:21.505: D/Fragment 1(704): onStart  
  2. 03-27 12:26:21.505: D/Fragment 1(704): onResume  
7. 按返回键,LogCat窗口中有如下显示。 [plain] view plaincopy
  1. 03-27 12:27:54.384: D/Fragment 1(704): onPause  
  2. 03-27 12:27:55.324: D/Fragment 1(704): onStop  
  3. 03-27 12:27:55.324: D/Fragment 1(704): onDestroyView  
  4. 03-27 12:27:55.324: D/Fragment 1(704): onDestroy  
  5. 03-27 12:27:55.324: D/Fragment 1(704): onDetach  

分析

1. 当一个fragment被创建的时候,它会经历以下状态.。

  • onAttach()
  • onCreate()
  • onCreateView()
  • onActivityCreated()

2. 当这个fragment对用户可见的时候,它会经历以下状态。

  • onStart()
  • onResume()

3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。

  • onPause()
  • onStop()

4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。

  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy() // 本来漏掉类这个回调,感谢xiangxue336提出。
  • onDetach()

5. 就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。

  • onCreate()
  • onCreateView()
  • onActivityCreated()

6. fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。

  • onAttached() —— 当fragment和activity关联之后,调用这个方法。
  • onCreateView() —— 创建fragment中的视图的时候,调用这个方法。
  • onActivityCreated() —— 当activity的onCreate()方法被返回之后,调用这个方法。
  • onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
  • onDetach() —— 当fragment和activity分离的时候,调用这个方法。