先來一副Fragment生命周期的圖解:
OnAttach()
作用:幫助Fragment與Activity進行交互。
Activity傳入Fragment:
public void onAttach(Activity activity) {
super.onAttach(activity);
titles = ((MainActivity) activity).getTitles();//通過強轉成宿主activity,就可以獲取到傳遞過來的數據
}
Fragment把值傳遞給Activity,可以時候接口回調。
1)在Fragment中定義接口。
2)在Activity中實現接口。
3)在OnAttach中獲取Activity實例,然后調用實現了的接口。
兩個Fragment通信,通常為兩個Fragment都綁定同一個Activity,可以使用Activity作為中介。
onCreate()
系統創建fragment的時候回調他,可以在其中初始化除了view之外的東西,例如實例化一些變量
通常這些變量是當Fragment暫停或停止時需要保存的變量。
如果我們要為Fragment啟動一個后臺線程,可以考慮將代碼放于此處。
參數是:Bundle savedInstance, 用于保存 Fragment 參數, Fragement 也可以 重寫 onSaveInstanceState(BundleoutState) 方法, 保存Fragement狀態;
可以用于 文件保護
他只調用一次。
onCreateView()
第一次使用的時候 fragment會在這上面畫一個layout出來, 為了可以畫控件 要返回一個 布局的view,也可以返回null。
當系統用到fragment的時候 fragment就要返回他的view,越快越好 ,所以盡量在這里不要做耗時操作,比如從數據庫加載大量數據顯示listview,
當然線程還是可以的。
給當前的fragment繪制ui布局,可以使用線程更新UI,說白了就是加載fragment的布局的。
這里一般都先判斷是否為null。
if(text==null){
Bundle args=getArguments();
text=args.getString("text");
}
if (view == null) {
view = inflater.inflate(R.layout.hello, null);
}
onActivityCreated()
當Activity中的onCreate方法執行完后調用。
注意了:
從這句官方的話可以看出:當執行onActivityCreated()的時候 activity的
onCreate才剛完成。
所以在onActivityCreated()調用之前 activity的onCreate可能還沒有完成,
所以不能再onCreateView()中進行 與activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面進行。
所以呢:這個方法主要是初始化那些你需要你的父Activity或者Fragment的UI已經被完
整初始化才能初始化的元素。
如果在onCreateView里面初始化空間 會慢很多,比如listview等。
onStart()
和activity一致,啟動Fragement 啟動時回調,,此時Fragement可見。
onResume()
和activity一致 在activity中運行是可見的。激活, Fragement 進入前臺, 可獲取焦點時激活。
onPause()
和activity一致 其他的activity獲得焦點,這個仍然可見
第一次調用的時候,指的是 用戶 離開這個fragment(并不是被銷毀)
通常用于 用戶的提交(可能用戶離開后不會回來了)
onStop()
和activity一致, fragment不可見的, 可能情況:activity被stopped了OR fragment被移除但被,加入到回退棧中,一個stopped的fragment仍然是活著的如果長時間不用也會被移除。
onDestroyView()
Fragment中的布局被移除時調用。
表示fragemnt銷毀相關聯的UI布局, 清除所有跟視圖相關的資源。
以前以為這里沒什么用處其實 大有文章可做,
相信大家都用過ViewPager+Fragment,由于ViewPager的緩存機制,每次都會加載3
頁。
例如:有四個 fragment 當滑動到第四頁的時候 第一頁執行onDestroyView(),但沒有
執行onDestroy。他依然和activity關聯。當在滑動到第一頁的時候又執行了
onCreateView()。 生命周期可以自己試一下。
那么問題來了。會出現重復加載view的局面,所以這么做(下面是先人的代碼)
@Override
public void onDestroyView() {
Log.i("onDestroyView_Fragment");
if(view!=null){
((ViewGroup)view.getParent()).removeView(view);
}
super.onDestroyView();
}
onDestroy()
銷毀fragment對象, 跟activity類似了。
onDetach()
Fragment和Activity解除關聯的時候調用。 脫離activity。