在项目中把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