Fragment用了很久了,接下來講一下我自己對fragment的理解。部分圖片內容參考官方文檔。
請各種參考這篇文章:http://blog.csdn.net/wanghao200906/article/details/45561385
先上一個生命週期的圖片吧
下面挨個的說一下我平時 都怎麼使用 這些 回調函數的
流程:
onAttach()
作用:fragment已經關聯到activity,
這個是 回調函數
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.i("onAttach_Fragment");
}
這個時候 activity已經傳進來了
獲得activity的傳遞的值
就可以進行 與activity的通信裏
當然也可以使用getActivity(),前提是這個fragment已經和宿主的activity關聯,並且沒有脫離
他只調用一次。
onCreate()
系統創建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
可見fragment的銷燬還是很優雅地,一個一個的來。
下面貼一下 activity和fragment同時運行時候的 生命週期
開始啓動:
05-07 05:55:08.553: I/Log(1990): oncreate
05-07 05:55:08.553: I/Log(1990): onAttach_Fragment
05-07 05:55:08.553: I/Log(1990): onCreate_Fragment
05-07 05:55:08.553: I/Log(1990): onCreateView_Fragment
05-07 05:55:08.553: I/Log(1990): onActivityCreated_Fragment
05-07 05:55:08.553: I/Log(1990): onStart
05-07 05:55:08.553: I/Log(1990): onStart_Fragment
05-07 05:55:08.553: I/Log(1990): onResume
05-07 05:55:08.553: I/Log(1990): onResume_Fragment
按下home按鍵
05-07 05:55:28.725: I/Log(1990): onPause_Fragment
05-07 05:55:28.725: I/Log(1990): onPause
05-07 05:55:29.221: I/Log(1990): onStop_Fragment
05-07 05:55:29.221: I/Log(1990): onStop
再回到界面
05-07 05:55:49.441: I/Log(1990): onRestart
05-07 05:55:49.441: I/Log(1990): onStart
05-07 05:55:49.441: I/Log(1990): onStart_Fragment
05-07 05:55:49.441: I/Log(1990): onResume
05-07 05:55:49.441: I/Log(1990): onResume_Fragment
銷燬activity
05-07 05:59:02.293: I/Log(1990): onPause_Fragment
05-07 05:59:02.293: I/Log(1990): onPause
05-07 05:59:02.757: I/Log(1990): onStop_Fragment
05-07 05:59:02.757: I/Log(1990): onStop
05-07 05:59:02.757: I/Log(1990): onDestroyView_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy_Fragment
05-07 05:59:02.757: I/Log(1990): onDetach_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy
可以看出 當現實fragment的時候都先執行activity方法,當銷燬的時候都是現執行 fragment的方法,這樣更好理解fragment是嵌套在activity中
時間倉促,理解不到位的儘管提出來,向各位大神學習