Android使用Fragment显示百度地图,当应用或者Activity被回收之后的恢复导致百度地图不能缩放和移动

最近在开发一个与地图相关的项目,项目中采用的是百度地图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);
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值