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!

相关文章
相关标签/搜索