最近在开发一个与地图相关的项目,项目中采用的是百度地图API,使用Fragment来显示地图界面。
在测试过程中发现一个问题,当界面处于地图界面时,应用或者Activity被回收之后(可以通过将应用退到后台,然后打开手机管理软件,加速一下手机内存来快速触发应用被回收),再次重新打开应用时,地图不能缩放和移动。
其实这个问题归根结底的原因是Activity与Fragment的机制导致的,跟百度地图没啥关系,百度地图不能缩放和移动只是这个问题的表现形式。
下面进入正题,简单地说一说Activity与Fragment的机制。Activity状态恢复大家应该都知道使onSaveInstanceState(Bundle outState)来保存Activity销毁之前的状态,然后通过onCreate(Bundle savedInstanceState)来获取保存的数据。但是我们可以看一下super.onSaveInstanceState(outState)的源码,发现里面其实保存了Fragment的状态,并且在super.onCreate(Bundle savedInstanceState)中又恢复了Fragment的状态。这里就简单的讲这么多,让大家知道有这么回事,有兴趣的同学可以自行去查看一下源码进行验证。
所以如果大家在恢复Activity状态时,没有注意到上述这一点,在恢复Activity时又重新创建了Fragment,这是其实已经存在了两个Fragment,一个是你代码中走正常逻辑创建的一个是Activity自动帮你恢复创建的,从而导致了一系列的问题(各种问题表现形式不一样)。
解决方案,既然我们数据都保存在了Bundle中,界面的恢复我们自己来搞定就行,super.onCreate(null),这样Fragment就不会自动恢复了。
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(null); setContentView(R.layout.activity_outdoor); initData(savedInstanceState); }