深刻的理解Fragment生命週期 都在做什麼

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中
時間倉促,理解不到位的儘管提出來,向各位大神學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章