Support Library25.1.0 fragment切换lifecycle坑点

在项目中把support-v7的版本升级到25.1.0之后遇到了一些问题,经追查发现是由于在25.1.0得时候Fragment切换得时候生命周期发生了变化。


在25.1.0之前,切换FragmentA 和FragmentB得时候生命周期变化如下:

FragmentA-->FragmentB:
FragmentA: onPause()
FragmentA: onStop()
FragmentB: onStart()

然后在25.1.0测试的切换结果如下:

FragmentA-->FragmentB:
FragmentB: onStart()
FragmentA: onPause()
FragmentA: onStop()

也就是说在25.1.0的时候fragment切换时是先启动了新的fragmentB并执行了onStart()和onResume()方法。之后才执行FragmentA的onPause()和onStop()方法。由于我们在生命周期方法里做了一些操作,这个改变就对我们的项目产生了影响。

后来通过搜索找到了google的issue230415里有相关的说明。是由于google对于fragment切换做了一些处理造成的现在这种问题。

解决方案:

  • 我们可以通过代码来恢复到以前的生命周期:
FragmentTransaction.setAllowOptimization(false)
  • 升级support包到25.1.1,在这个版本默认是调用了上面的方法的。

Project Member #4
This is an intended behavior change. There is new functionality to optimize the operations and postpone fragment transitions and this is a side effect of that.

You can disable fragment operation optimizations by calling FragmentTransition.setAllowOptimization(false). This forces everything to happen in the proper order, but also disallows the operations from optimized.

There are now tests for this behavior.

上面是issue中关于这个情况的解释:
这是一个想要的行为变更,这是一个新功能用来优运行和延迟过渡。而生命周期的改变是新功能的副作用。
你可以通过调用FragmentTransition.setAllowOptimization(false)来关闭fragment的运行优化。这样做会使一切恢复正常,但是无法得到优化了。

在25.1.1版本更新中默认关闭了fragment切换优化操作,可以正常使用生命周期方法了。
https://developer.android.com/topic/libraries/support-library/revisions.html#25-1-1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,813评论 25 708
  • 不知道从什么时候开始,当自己搬着很重的东西走在路上的时候,总是有一种不自在的感觉,仿佛被别人用异样的眼光紧紧盯着。...
    安安宝阅读 207评论 2 1
  • 落红化春泥, 栋梁辞根蒂。 何须殇离别, 只为正归期。 ——致:所有在外拼搏的人儿
    牧师shi阅读 279评论 1 1