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的方法。