1. 程式人生 > >理解Fragment,生命週期以及各個週期做什麼事,快取fragment不被銷燬

理解Fragment,生命週期以及各個週期做什麼事,快取fragment不被銷燬

最近做個小東西時用到fragment所以深刻的鞏固了下基礎知識,先上個官方的流程圖

onAttach()

主要用於與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
這裡一般都先判斷是否為null

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佈局
清除所有跟檢視相關的資源

說到fragment,肯定viewpager是少不了的,也遇到一個問題就是滑動後fragment就被銷燬了,以前的資料全都沒有了,
所以在這裡介紹幾種我親身實踐的方法。
1.
mViewPager.setOffscreenPageLimit(3);

如果你得頁面很少,而且對於流暢度不是特別特別高的要求的話,就可以用這行程式碼,它的意思就是你想快取九幾個頁面。
2.
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub

if (rootView == null) {

        rootView = inflater.inflate(R.layout.fragment, container, false);
    }


} else {
    ViewGroup viewGroup = (ViewGroup) rootView.getParent();
    if (viewGroup != null)
        viewGroup.removeView(rootView);
}
return rootView;

}
我個人非常推薦這種方法,什麼情況都可以完美適應,如果頁面很多的話,可能你只有用這種方法了。
我看到網上都log一下 我也去試了試 activity和fragment同時執行時候的 生命週期 如下:

    開始啟動:

    08-07 08:32:08.323: I/Log(kk): oncreate
    08-07 08:32:08.323: I/Log(kk): onAttach_Fragment
    08-07 08:32:08.323: I/Log(kk): onCreate_Fragment
    08-07 08:32:08.323: I/Log(kk): onCreateView_Fragment
    08-07 08:32:08.323: I/Log(kk): onActivityCreated_Fragment
    08-07 08:32:08.323: I/Log(kk): onStart
    08-07 08:32:08.323: I/Log(kk): onStart_Fragment
    08-07 08:32:08.323: I/Log(kk): onResume
    08-07 08:32:08.323: I/Log(kk): onResume_Fragment


    按下home按鍵

    08-07 08:33:48.748: I/Log(kk): onPause_Fragment
    08-07 08:33:48.748: I/Log(kk): onPause
    08-07 08:33:49.441: I/Log(kk): onStop_Fragment
    08-07 08:33:49.441: I/Log(kk): onStop



    再回到介面

    08-07 08:32:49.441: I/Log(kk): onRestart
    08-07 08:32:49.441: I/Log(kk): onStart
    08-07 08:32:49.441: I/Log(kk): onStart_Fragment
    08-07 08:32:49.441: I/Log(kk): onResume
    08-07 08:32:49.441: I/Log(kk): onResume_Fragment


    銷燬activity

    08-07 08:89:04.493: I/Log(kk): onPause_Fragment
    08-07 08:89:04.493: I/Log(kk): onPause
    08-07 08:89:04.787: I/Log(kk): onStop_Fragment
    08-07 08:89:04.787: I/Log(kk): onStop
    08-07 08:89:04.787: I/Log(kk): onDestroyView_Fragment
    08-07 08:89:04.787: I/Log(kk): onDestroy_Fragment
    08-07 08:89:04.787: I/Log(kk): onDetach_Fragment
    08-07 08:89:04.787: I/Log(kk): onDestroy


    看出當顯示fragment的時候都先執行activity方法,當銷燬的時候都是現執行 fragment的方法。