android activity與fragment 的區別

當面試官突然問就聞到這個問題當時我就有點懵,平常都沒怎麼注意這個問題,這麼一問出來就卡了
心裏倒是覺得Fragment與Activity的區別我知道啊,編碼的時候用的很多,感覺對這兩個Android的主要控件也是很瞭解的,但是當時回答就糟透了,說了生命週期,其他巴拉巴拉的說了一通,fragment 生命週期少說了幾個
現在就來複盤,扒一下。

1、從最基礎的開始說--->生命週期

 Activity有7個生命週期:onCreate()---> onStart()--->onResume() --->onPause() --->onStop() --->onDestroy() --->onRestart();

 Fragment有11個生命週期:onAttach() --->onCreate() --->onCreateView() --->onActivityCreate() --->onStart() --->onResume() --->onPause() --->onStop() --->onDestroyView() --->onDestroy() --->onDetach();

 所以Fragment比較與Activity來說會更加靈活,因爲生命週期多了,你可以控制的地方也就多了。

  其中
onAttach() 
作用:fragment已經關聯到activity,這個時候 activity已經傳進來了, 獲得activity的傳遞的值 就可以進行 與activity的通信裏, 當然也可以使用getActivity(),前提是這個fragment已經和宿主的activity關聯,並且沒有脫離,有且只有調用一次。
onCreate()
系統創建fragment的時候回調他,在他裏面實例化一些變量,這些個變量主要是:當你暫停、停止的時候 你想保持的數據、他只調用一次。
onCreateView()
第一次使用的時候 fragment會在這上面畫一個layout出來, 爲了可以畫控件 要返回一個 佈局的view,也可以返回null j 就什麼都沒有顯示。 
當系統用到fragment的時候 fragment就要返回他的view,越快越好 ,所以儘量在這裏不要做耗時操作,比如從數據庫加載大量數據 
onActivityCreated()
當Activity中的onCreate方法執行完後調用。當執行onActivityCreated()的時候 activity的onCreate纔剛完成。所以在onActivityCreated()調用之前activity的onCreate可能還沒有完成,所以不能再onCreateView()中進行與activity有交互的UI操作,UI交互操作可以在onActivityCreated()裏面進行。所以呢,這個方法主要是初始化那些你需要你的父Activity或者Fragment的UI已經被完整初始化才能初始化的元素。
onStart()
和activity一致,啓動Fragement 啓動時回調,,此時Fragement可見。
onResume()
和activity一致 在activity中運行是可見的。激活, Fragement 進入前臺, 可獲取焦點時激活。
onPause()
和activity一致 其他的activity獲得焦點,這個仍然可見第一次調用的時候,指的是 用戶 離開這個fragment(並不是被銷燬)
通常用於 用戶的提交(可能用戶離開後不會回來了)
onStop()
和activity一致, fragment不可見的, 可能情況:activity被stopped了或者 fragment被移除但被,加入到回退棧中,一個stopped的fragment仍然是活着的如果長時間不用也會被移除。
onDestroyView() 
Fragment中的佈局被移除時調用。表示fragemnt銷燬相關聯的UI佈局, 清除所有跟視圖相關的資源。然後這個知識移除視圖  並沒有銷燬而且還沒有脫離activity
onDestroy()
銷燬fragment對象, 跟activity類似了。
onDetach()
Fragment和Activity解除關聯的時候調用。 脫離activity。

2、從靈活性上來說,fragment顯得更加靈活。可以直接在XML文件中添加<fragment/>,Activity則不能。

<fragment
Android:id="@+id/test_fragment1"
Android:name="com.example.fragmenttest.TestFragment1"/>

<fragment
Android:id="@+id/test_fragment2"
Android:name="com.example.fragmenttest.TestFragment2"/>

3.可以在一個界面上靈活的替換一部分頁面,Activity不可以,做不到,activity 只能進行跳轉切換。

4.fragment和Activity之間的通信:(也就是控件的相互操控)

fragment控制fragment:得到一個Activity,然後通過這個Activity的getFragmentManager()獲得該Fragment的實例。

fragment控制Activity:這個很簡單。每個Fragment都有getActivity()得到一個活動。MainActivity activity=getActivity();

Activity控制fragment:xxxFragment xxx=getFragmentManager().findFragmentById();

Activity控制Activity:這個顯然是通過Intent活動之間的通信完成。

5.fragment和Activity中控件的加載

Fragment的載入是通過OnCreateView的時候通過inflater.inflate()加載佈局
Activity的載入是通過OnCreate的時候通過setContentView()加載佈局

6.動態加載不同的fragment

FragmentManager fragmentManager = getSupportFragmentManager();
List<Fragment> fragments new ArrayList<>();
xxxFragment  fragment = new xxxFragment ();
fragments.add(fragment );
hideOthersFragment(fragment , true);

…………………………
    @Override
    public void onItemClick(int position) {
        switch (position) {
            case 0:
               hideOthersFragment(fragment, false);
                break;
            case 1:
                if (xxxFragment2 == null) {
                       xxxFragment2 fragment2  = new xxxFragment2();
                       fragments.add(fragment2);
                        hideOthersFragment(fragment2, true);
                   } else {
                       hideOthersFragment(fragment2, false);
                   }
                break;
            case 2:
                if (xxxFragment3 == null) {
                       xxxFragment3 fragment3  = new xxxFragment3();
                       fragments.add(fragment3);
                        hideOthersFragment(fragment3, true);
                   } else {
                       hideOthersFragment(fragment3, false);
                   }
                break;
            

        }
    }

/**
     * 動態顯示Fragment
     *
     * @param showFragment 要增加的fragment
     * @param add          true:增加fragment;false:切換fragment
     */
    private void hideOthersFragment(Fragment showFragment, boolean add) {
        transition = fragmentManager.beginTransaction();
        if (add)
            transition.add(R.id.main_container_content, showFragment);
        for (Fragment fragment : fragments) {
            if (showFragment.equals(fragment)) {
                transition.show(fragment);
            } else {
                transition.hide(fragment);
            }
        }
        transition.commit();
    }

 

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