Android Fragment的生命週期和優化

1、Fragment的生命週期

1.onAttach->onCreate.....->onDestroy->onDettachide

  這條生命週期是一個完整的生命週期,onAttach表示從Actitivity附着,onDettach表示從Activity剝離,通常來講,調用add方法後悔有這條流程。優化

  注意:在FragmentActivity中使用事務的方法attach和dettach並不會調用onAttach和onDettach,那會發生什麼變化呢,看第三條spa

2. onSaveInstanceState-->onStop ... onStart->onResume-->....設計

   這條生命週期和Activity的onRestart有着必定的關聯。code

   注意,Activity每次調用onRestart以後,Fragment就會執行這條生命週期,可是要注意的是,這條生命週期並不可靠,有時不會執行。生命週期

3.onDestroyView-> .... ->onCreateView ->onViewCreate事務

  生命週期反了麼,答案是否認的。調用者條生命週期每每是使用了事務的方法dettach和attach。開發

注意:在這種流程中,能夠更好的管理Fragment的加載,也能夠解決疊加問題,生命週期循環問題。rem

4.重複onAttach->onCreate.....->onDestroy->onDettachget

這條生命週期是因爲每次都是用的是replace方法

5.持久態

在經歷了.onAttach->onCreate->onCreatView-->...->onResume以後,若是沒掉用replace,add,attach,dettach,而是使用了簡單的hide,show等方法

注意:這種可用於回退棧操做。

 

2、優化Fragment防止頁面屢次inflate

Android 3.0開始Fragment屢次受到普遍關注,是的頁面開發更加方便。

FragmetnManager+FragmentTransaction+Fragment+FragmentActivity是4個永遠離不開的組件。所以來講,
開發難度有所提高的同時,效率問題也成爲了重點考慮的。
開發時常常遇到的Fragment問題有:管理,事務,添加,移除,通訊,回退棧。Fragment的
效率問題發生的緣由是FragmentManager設計並不完美形成的。FragmentManager只作了一
半工做,剩下的一半管理工做須要由開發人員來實現。

開發Fragment須要注意一下幾點:

  1. 若是Fragment頁面只出現一次,相似歡迎界面的話 使用 replace+不斷新建Fragment方法便可

  2. 若是使用Fragment+BackStack,不要使用replace,應該使用add+remove+popBackStack+addToBackStack+hide+show

  3. 若是是作Tab頁面,確切的說你還須要定義至少一個List<Fragment> fragmentList。

    將初始化完畢的全部Fragment加入fragmentlist,而後使用 add+attach+detattch方法進行管理,add負責添加,其餘2個方法負責切換,這樣效率特別好,防止了Fragment的疊加。

  4. Fragment的內部優化,依據Fragment的生命週期,onCreateView和onDestroyView會被反覆調用,所以需定義一個全局的contenrView優化以下

     

     

private View contentView = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
 {
	if(contentView==null)
	{
	 contentView = inflater.inflate(R.layout.testlayout, container,false
	}
	if(contentView!=null)
	{
	  return contentView;
	}
		
	return super.onCreateView(inflater, container, savedInstanceState);
}
    
    public void onViewCreated(View view, Bundle bundle)
    {
        if(view!=null)
        {
           TextView tv = view.findViewById(R.id.showTv);
           tv.setTextView("請在這裏初始化頁面數據");
        }
    }


	@Override
	public void onDestroyView()
	{
		//移除當前視圖,防止重複加載相同視圖使得程序閃退
		((ViewGroup)contentView.getParent()).removeView(contentView);
		super.onDestroyView();
	}

 

Try doing it!

相關文章
相關標籤/搜索