這篇文章主要介紹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給出的圖示:

還有1個示意圖對比了activity和fragment的生命周期

可以看出,fragment的onAttatch,onCreate,onCreateView,onActivityCreated是fragment的創建階段,相當于Activity的創建階段,onStart,onResume,onPause,onStop的流程都和Activity一樣,銷毀階段,包含了onDestroyView,onDestroy,onDetach方法。
下面用例子來演示fragment的生命周期:
初次啟動的Activity:
MainActivity.java
~~~
public class MainActivity extends Activity {
private Button goFragment;
private Button goActivity;
private boolean first = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v("test", "Activity-onCreate");
initViews();
}
@Override
protected void onResume() {
super.onResume();
Log.v("test", "Activity-onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.v("test", "Activity-onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.v("test", "Activity-onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.v("test", "Activity-onDestroy");
}
private void initViews() {
goFragment = (Button) findViewById(R.id.go_fragment);
goActivity = (Button) findViewById(R.id.go_activity);
goFragment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, new FragmentB());
ft.commit();
}
});
goActivity.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Activity2.class));
}
});
}
@Override
protected void onStart() {
Log.v("test", "Activity-onStart");
super.onStart();
//防止重復加載fragment
if(first) {
first = false;
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.container, new FragmentA());
ft.commit();
}
}
}
~~~
布局文件:
~~~
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity" >
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="350dp"
/>
<Button
android:id="@+id/go_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="go fragment2" />
<Button
android:id="@+id/go_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="go Activity2" />
</LinearLayout>
~~~
界面上一個frameLayout,用來裝載fragment,2個按鈕,一個用來替換fragment,一個用來跳轉activity
FragmentA的代碼:
~~~
public class FragmentA extends Fragment {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.v("test", "FragmentA:" + "onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v("test", "FragmentA:" + "onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.v("test", "FragmentA:" + "onCreateView");
return inflater.inflate(R.layout.fragment1, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.v("test", "FragmentA:" + "onActivityCreated");
}
@Override
public void onStart() {
super.onStart();
Log.v("test", "FragmentA:" + "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.v("test", "FragmentA:" + "onResume");
}
@Override
public void onPause() {
super.onPause();
Log.v("test", "FragmentA:" + "onPause");
}
@Override
public void onStop() {
super.onStop();
Log.v("test", "FragmentA:" + "onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.v("test", "FragmentA:" + "onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.v("test", "FragmentA:" + "onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.v("test", "FragmentA:" + "onDetach");
}
}
~~~
Activity和fragment的回調中都進行了日志打印。
在Acitivity的onStart方法中,調用了如下代碼:
~~~
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.container, new FragmentA());
ft.commit();
~~~
作用是在Acitivity啟動后在界面上加載一個fragment。
啟動程序,觀察控制臺輸出:
~~~
10-27 18:20:23.423: V/test(3128): Activity-onCreate
10-27 18:20:23.423: V/test(3128): Activity-onStart
10-27 18:20:23.423: V/test(3128): FragmentA:onAttach
10-27 18:20:23.423: V/test(3128): FragmentA:onCreate
10-27 18:20:23.423: V/test(3128): FragmentA:onCreateView
10-27 18:20:23.423: V/test(3128): FragmentA:onActivityCreated
10-27 18:20:23.423: V/test(3128): FragmentA:onStart
10-27 18:20:23.423: V/test(3128): Activity-onResume
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:
~~~
10-27 18:44:23.513: V/test(3128): FragmentA:onPause
10-27 18:44:23.513: V/test(3128): FragmentA:onStop
10-27 18:44:23.513: V/test(3128): FragmentA:onDestroyView
10-27 18:44:23.513: V/test(3128): FragmentA:onDestroy
10-27 18:44:23.513: V/test(3128): FragmentA:onDetach
~~~
正是第一張圖片所示的從前臺到銷毀的過程。
現在重啟程序,試著點擊第二個按鈕go Activity2,觀察logcat輸出:
~~~
10-27 19:08:34.253: V/test(3128): FragmentA:onPause
10-27 19:08:34.253: V/test(3128): Activity-onPause
10-27 19:08:34.573: V/test(3128): FragmentA:onStop
10-27 19:08:34.573: V/test(3128): Activity-onStop
~~~
可以看到,當前Activity被覆蓋后,fragment的onPause,onStop和Activity的onPause,onStop同時被調用。
這時,按物理返回鍵,退出第二個Activity,回到第一個Activity,觀察logcat輸出:
~~~
10-27 19:29:07.063: V/test(9162): Activity-onStart
10-27 19:29:07.063: V/test(9162): FragmentA:onStart
10-27 19:29:07.063: V/test(9162): Activity-onResume
10-27 19:29:07.063: V/test(9162): FragmentA:onResume
~~~
可見,在activity重新進入前臺,執行onStart和onResume時,fragment也執行一樣的操作
現在修改一下跳轉activity的按鈕的代碼,讓當前activity finish
~~~
goActivity.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Activity2.class));
finish();
}
});
~~~
重啟程序,點擊跳轉activity的按鈕,觀察輸出:
~~~
10-27 19:33:54.893: V/test(9810): FragmentA:onPause
10-27 19:33:54.893: V/test(9810): Activity-onPause
10-27 19:33:55.213: V/test(9810): FragmentA:onStop
10-27 19:33:55.213: V/test(9810): Activity-onStop
10-27 19:33:55.213: V/test(9810): FragmentA:onDestroyView
10-27 19:33:55.213: V/test(9810): FragmentA:onDestroy
10-27 19:33:55.213: V/test(9810): FragmentA:onDetach
10-27 19:33:55.213: V/test(9810): Activity-onDestroy
~~~
原文地址:[http://blog.csdn.net/oHeHeHou/article/details/13168791](http://blog.csdn.net/oHeHeHou/article/details/13168791)
- 前言
- android SharedPreference的簡單使用(登陸界面記住密碼)
- android 通知Notification的使用小實例(振動,燈光,聲音)
- android調用攝像頭拍照,從相冊中選擇照片并裁剪
- android從相冊中獲取圖片出錯,圖片無法裁剪的問題
- android 后臺定時提醒(Service,AlarmManager的使用)
- android如何讓后臺服務service不被殺死(設置前臺服務)
- android修改控件外觀(使用drawable資源)
- android 自定義view的使用(最佳demo——返回標題欄)
- android viewpager+fragment做主界面(超容易理解的demo!)
- Fragment生命周期
- Android DrawerLayout 高仿QQ5.2雙向側滑菜單
- Android DrawerLayout側滑菜單+nineoldandroids動畫
- Android 通知欄Notification的整合 全面學習 (一個DEMO讓你完全了解它)
- Android應用開發-護眼提醒-總結篇