Fragment生命周期,以及hide() show() replace() add() remove() addToBackStack(null)等对Fragment生命周期的影响

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010221508/article/details/88379830

Fragment的生命周期

在这里插入图片描述
Fragment的生命周期如图所示,注意点:
在onAttach()方法回调的时候,说明Fragment已经附着到了Activity上,在onAttach方法中获取它所在的Activity对象并且保存为全局属性,以便后面的方法中使用,切记不要使用getActivity来获取它所在的activity对象,因为这个方法有的时候会返回为空,因为在某些情况下,Activity有可能被回收。

使用show() hide()方法来切换多个Fragment页面的时候,Fragment的生命周期

当我们在某个Activity中add了多个Fragment实例,切换不同的Fragment页面的时候,是通过show()和hide()方法来实现的,那么Fragment的生命周期方法是不会走的,只会走onHiddenChanged(boolean hidden)方法,我们可以通过这个方法来监听Fragment页面的显示和隐藏。
但是当我们点击home键,把整体页面切到后台的时候,宿主Activity和它里面的各个Fragment的onPause(),onStop()方法都会执行。我们再点击应用图标把应用当前页面且回到前台的时候,宿主Activity和它里面的各个Fragment的onStart()、onResume()方法都会执行。当然Activity的onRestart()方法也会执行。
假如当我按home键,把整体页面切到后台,我再点击应用图标,应用从后台切回到前台的时候,我只需要执行当前将要显示的Fragment的onResume()里面的逻辑,其他Fragment里面的onResume逻辑我不需要执行,因为它们还在后面隐藏着,那么我该怎么办呢,
所有的Fragment的方法加个这种判断即可
解决方案:

		@Override
		public void onResume() {
			//判断当前Fragment是否处于显示状态
			if(isVisible()) {
			
  			}
		}
使用replace() 或者 add() remove() 方法来切换多个Fragment页面的时候,Fragment的生命周期

比如从Fragment1界面打开Fragment2界面
在这里插入图片描述
在这里插入图片描述
从log可以看出通过remove()和add()方法显示隐藏Fragment,被add进来的FragmentTwo的生命周期为onAttach、onCreate、onCreateView、onActivityCreated、onStart、onResume。
被remove掉的FragmentOne的生命周期为onPause、onStop、onDestroyView、onDestroy、onDetach
replace相当于add和remove两个方法一起作用的结果,所以结论和上面一样

当把隐藏(remove掉)的Fragment加入到回退栈中,对其生命周期有什么影响呢???

在这里插入图片描述
在这里插入图片描述
可以看到FragmentTwo的生命周期和之前没有变化,但是被加入回退栈中的FragmentOne的生命周期变为了onPause、onStop、onDestroyView。只是把Fragment的界面销毁了,Fragment实例并没有销毁。
按返回键:
在这里插入图片描述
可以看到FragmentOne的生命周期为onCreateView、onStart、onResume
FragmentTow的生命周期为:onPause、onStop、onDestroyView、onDestroy、onDetach

因为replace是add和remove两个方法的一起使用所起的效果,和上面一样

如果以ViewPager的形式添加多个Fragment,滑动切换Fragment,那么Fragment切换的时候,生命周期也不会执行,onHiddenChanged也不会执行,可以通过setUserVisibleHint(boolean isVisibleToUser)方法监听Fragment页面的显示与隐藏。

猜你喜欢

转载自blog.csdn.net/u010221508/article/details/88379830