为Fragment增加入新的生命周期,并实现管理

1.  背景知识

ViewPager+Fragment实现滑动标签页时,默认情况下,Fragment的生命周期是由FragmentPagerAdapter和Activity共同管理的。
(1) Activity维持在onResume状态时,Fragment的生命周期主要由FragmentPagerAdapter进行管理。进行了预加载的Fragment会处于onResume状态(即使没有变成可操作),预加载多少个Fragment,可以通过    ViewPager::setOffscreenPageLimit()函数进行设置。
   在切换滑动标签页时,已经预加载的Fragment的生命周期不会被触发改变,仍然是onResume。

(2) 当Activity的生命周期发生变化时,所有已经预加载的Fragment的生命周期与Activity保持一致。
   Fragment生命周期与Activity生命周期的关系(主要看onResume和onPause):
     onResume执行顺序 :
        Activity::onResume() -> Fragment::onResume. (Synchronously)
     onPause执行顺序 :
        Fragment::onPause -> Activity::onPause.     (Synchronously)

2.项目需求

在我们的项目中,因为既需要同时加载多个Fragment, 又需要在Fragment变为可见时做一些事情,不可见时又做一些事情(如切换到该标签页时进行视频播放,退出该标签页时关闭播放),因此,继承Fragment,我们实现自己的MyFragment,在MyFragment中增加了另外两个生命周期: onEnter() (fragment变为可见时回调), onExit()(fragment变为不可见时回调)。这样,我们就可以在onEnter中做开始播放的操作,在onExit中停止播放。

3.解决方案

根据需求中的描述,增加了两个生命周期后,完整的Fragment的生命周期就变为:
         onCreate()->onCreateView()->onStart()->onResume()->onEnter()->onExit()->onPause()->onStop()->onDestroyView()->onDestroy().

为了确保生命周期的顺序,需要继承FragmentStatePagerAdapter实现自己的MyFragmentStatePagerAdapter, 重写setPrimaryItem()函数来控制Fragment的生命周期。实现如下:
             MyFragmentStatePagerAdapter::setPrimaryItem(ViewGroup container, int position, Object object) {
                      MyFragment myFragment = (MyFragment)object;
                      if ((myFragment != NULL) && myFragment.isResumed()) {
                          if (myFragment != mpCurrentPrimaryItem) {
                              if (mpCurrentPrimaryItem) {
                                   mpCurrentPrimaryItem.onExit();
                                   mpCurrentPrimaryItem = NULL;
                              }
                              if (myFragment) {
                                  myFragment.onEnter();
                                  mpCurrentPrimaryItem = myFragment;
                             }
                         }
                    }
              }

  • MyFragment::onEnter会在几种情况下被执行:

(1)  当Activity是第一次启动时,进入到onResume, 调用ViewPager::setAdapter()函数第一次给ViewPager设置MyFragmentStatePagerAdapter时, 会回调到setPrimaryItem(), 从而使MyFragment进入onEnter.

(2)  若Activity不是第一次进入onResume, 就不能通过ViewPager::setAdapter使fragment进入onEnter了。这时需要在Activity::onResume中给MyFragment设置一个需要进入onEnter的标记,在MyFragment随后进入onResume时(背景知识有说明),找到MyFragment所在的ViewPager,并获取Adapter, 然后调用setPrimaryItem()使自己进入onEnter.

(3)  切换页面时,由MyFragmentStatePagerAdapter::setPrimaryItem()执行。

  • MyFragment::onExit会在两种情况下被执行:

(1) 一种是在Activity执行onPause之后,MyFragmentStatePagerAdapter::setNonePrimaryItem()使MyFragment执行onExit().
MyFragmentStatePagerAdapter::setNonePrimaryItem() {
    if (mpCurrentPrimaryItem) {
        mpCurrentPrimaryItem.onExit();
        mpCurrentPrimaryItem = NULL;
    }
}

需要说明的一点是,由于在Activity onPause之前,已经加载的Fragment会先执行onPause, 所以这种情况下不能确保onExit在onPause之前,这时MyFragmnet生命周期为:onResume()->onEnter()->onPause()->onExit()->onStop(). (这点在我们项目中没有影响)

(2) 第二种是在切换页面时,由MyFragmentStatePagerAdapter::setPrimaryItem()实现。

时间: 2024-08-28 17:04:51

为Fragment增加入新的生命周期,并实现管理的相关文章

Fragment 使用add 和 hide 生命周期

1.先add两个Fragment ,然后立马hide这两个Fragment ,再然后显示其中一个Fragment //先add FragmentTransaction beginTransaction = getFragmentManager().beginTransaction(); videoFragment = new NewSDAndCloudVideoFragment(NewSDAndCloudVideoFragment.SRC_FROM_PLATFORM); sdFragment =

WebApp中的页面生命周期及路由管理

最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在其中尽显无遗. 说说自己对Backbone优缺点的看法. Backbone确实是优秀的单页MVC框架,Events自定义事件机制,为Model/View/Colllection提供基础模块通信,Aync模块封装了CRUD的ajax操作,Router/History为开发者提供了路由机制,从很大程度上

PHP扩展-生命周期和内存管理

1. PHP源码结构 PHP的内核子系统有两个,ZE(Zend Engine)和PHP Core.ZE负责将PHP脚本解析成机器码(也成为token符)后,在进程空间执行这些机器码:ZE还负责内存管理,变量作用域管理和对PHP函数的调度管理. PHP Core负责和SAPI层的通信:PHP Core也为safe_mode, open_basedir的检查提供了统一控制层:PHP Core还提供了streams层,用于用户域的文件和网络IO操作.其中SAPI(Server Application

[百度空间] [原]基于内存生命周期的内存管理

如果根据声明周期划分的话,内存可以大至划分为3类 1.静态内存 2.临时内存 3.普通内存 静态内存的特点是,程序开始(通常是初始化期间)分配的,而后就不会释放,直到程序结束,典型的如singleton,相信还有很多类,其实例只会被分配一次,而且理论上,生存期是贯穿整个程序的. 临时内存的特点通常如下: void function(){    ...    char* buffer = new char[size]; ... delete [] buffer;} 从上面可以看到,此种内存分配后,

Fragment的生命周期&同一Activity下不同Fragment之间的通信

Android开发:碎片Fragment完全解析(2) Fragment的生命周期 和Activity一样,Fragment也有自己的生命周期,理解Fragment的生命周期非常重要,我们通过代码的方式来瞧一瞧Fragment的生命周期是什么样的: 1 publicclass Fragment1 extends Fragment { 2 publicstaticfinal String TAG = "Fragment1"; 3 @Override 4 public View onCre

Fragment生命周期(转)

Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互.Fragment允许这样的一种设计,而不需要你亲自来管理viewhierarchy的复杂变化. 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化. 例如, 一

友盟页面统计 - 关于Viewpager中的Fragment的生命周期

Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的.在此不表: Fragment从出现到广泛运用也有一段时间了.其标准生命周期也仅比Activity多出一些流程,如onCreateView(); Activity和Fragment在实际编码中必然是结合出现的,表现为Activity作为容器,装载有一个或若干个Fragment: 装载多个Fragment时,常常使用TabHost和Viewpager作为载体: 在实际编码中发现,Activity和

Fragment生命周期-基于实验的最新总结

现在很多应用的开发都是基于FragmentActivity中嵌套Fragment进行开发的,所以,如果我们能够清晰地知道他们的生命周期,那么会使我们的开发变的容易. 对于Activity的生命周期,我在之前的文章 Activity生命周期-基于实验的最新总结  中已经说的很详细了,因此本篇文章只是从实践角度来讲一下Fragment的生命周期以及Fragment与Activity生命周期的对应关系,像大多数介绍Fragment生命周期的文章一样,先上两张图: 好,言归正传 这里从实例的角度来说明一

深刻的理解Fragment生命周期 都在做什么

Fragment用了很久了,接下来讲一下我自己对fragment的理解.部分图片内容参考官方文档. 请各种参考这篇文章:http://blog.csdn.net/wanghao200906/article/details/45561385 先上一个生命周期的图片吧 下面挨个的说一下我平时 都怎么使用 这些 回调函数的 流程: onAttach() 作用:fragment已经关联到activity, 这个是 回调函数 @Override public void onAttach(Activity