项目中回退Fragment导致界面刷新的猜想

来源:互联网 发布:傲翼网络 编辑:程序博客网 时间:2024/05/11 21:06

最近做一个关于平板的项目,用到了一个Fragment管理类的框架,做的过程中发现点击返回键会刷新上一界面的数据,回忆之前所做的手机项目,从ListView点击到二层界面再返回,并未出现刷新界面的操作,于是写了个Demo验证一下Activity的声明周期,基础知识虽然在实际开发中很少用到,但是也得必须掌握。

Demo完成怎样的逻辑:主界面MainActivity中有一个ListView,点击ListView中的条目会跳到DetailActivity中,并将条目内容显示到第二界面上的TextView中。逻辑很简单,我们目的是研究下跳转的过程中走了哪些生命周期的函数。

1.打开主界面,所经历的函数如下图所示:
这里写图片描述
2.点击ListView中第一条目,进行跳转:
这里写图片描述
我们可以看到,第一界面在执行了onPause之后,第二界面开始了显示过程,之后第一界面执行了onStop。
3.在第二界面显示完毕后,点击返回(Back)键,会出现如下调用过程:
这里写图片描述
着重看界面1111,从onStop直接就onRestart,继而onStart–>onResume,是不是发现一个奇怪的问题,这次并未经历onCreate过程,我想我之前的疑问到此应该可以有个合理的解释了,我们在编写某个列表获取数据的请求往往都会放到onCreate函数中,这样我们在首次打开界面的时候会自动请求数据并加载显示,点击条目进行详情页之后,再次点击返回,并未走onCreate,也就不会有再一次的刷新,所以界面就像是保存了信息一样,打开的时候什么样子,回来的时候也是什么样子。

但是我那个项目用到的是Fragment的一个框架,再打开新界面的时候会detach掉上一个界面,在按下返回键时候会attach上一个界面,而两者的触发顺序如下:
detach()->onPause()->onStop()->onDestroyView()
attach()->onCreateView()->onActivityCreated()->onStart()->onResume()
我们所有的请求数据都写到了onCreateView中,所以每次Back之后还是会调用请求,继而刷新界面。

从其他地方看到一块Fragment的知识点不错,做个引用:

使用add()加入fragment时将触发onAttach(),使用attach()不会触发onAttach()
使用replace()替换后会将之前的fragment的view从viewtree中删除
使用hide()方法只是隐藏了fragment的view并没有将view从viewtree中删除,随后可用show()方法将view设置为显示
而使用detach()会将view从viewtree中删除,和remove()不同,此时fragment的状态依然保持着,在使用 attach()时会再次调用onCreateView()来重绘视图,注意使用detach()后fragment.isAdded()方法将返回 false,在使用attach()还原fragment后isAdded()会依然返回false(需要再次确认)

附录:
Activity生命周期图:
这里写图片描述
Fragment生命周期图:
这里写图片描述

0 0