在我正在开发的android应用程序中,我需要locationmanager为我提供位置修复。那部分很好,很好,很有效,已经有很长一段时间了,大家都很高兴。
不过,既然我最近还添加了一个允许位置跟踪部分转到后台的功能,我还想允许它减慢更新速度,以节省电池电量。实际上,我尝试这样做的方法是,如果后台服务检测到不再有任何侦听器注册,则使用新参数重新发出requestLocationUpdates调用(它向通知栏提供了一些内容,因此我仍然希望它获得更新)。我们把这个服务叫做“servicemajig”。简而言之,我这样做的方式:

private void setMode(boolean foreground) {
    // This sets whether we're in foreground or background mode.  If we're
    // not changing anything, though, don't do anything.
    if(foreground == mForeground) return;

    // Set the current mode...
    mForeground = foreground;

    // ...and switch!
    if(mForeground) {
        // Foreground mode means we go full tilt.
        Log.i(DEBUG_TAG, "Switching to foregroud mode...");
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, Servicemajig.this);
    } else {
        // Background mode means we slow down.  Like, say, 30 seconds.
        Log.i(DEBUG_TAG, "Switching to background mode...");
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, Servicemajig.this);
    }
}

现在,这在很大程度上是可行的。我没有得到两次更新(即,我没有先注销,但它仍然发挥作用),在我的NexusOne和G1,这是正确的切换背景和前景模式之间的需要。也就是说,它将正确地等待约30秒(给予或采取),然后再试图获得另一个位置修复,节省电池电量。
当我在摩托罗拉机器人上测试时,问题就来了。在droid和单独的droid上,一旦我将其置于后台模式,两次修复之间将等待30秒(再次,给予或接受),但如果它确实以这种方式获得了至少一个修复,则以后不会返回前台模式。也就是说,即使在我重新进入前台模式所需和请求的实际应用程序之后,每次修复仍要等待30秒,而且除了关闭ServiceMajig并重新启动它之外,我似乎无法绕过这一点。日志显示它正在传递代码的那一部分,所以它至少达到了这个程度。
所以我的问题是,这只是机器人固件特有的一个bug吗?我有办法解决这个问题吗?或者这样做是正确的吗?我会注意到,在带有registerLocationUpdates调用的if块之前添加removeUpdates调用并不重要。

最佳答案

这听起来可能很愚蠢,但我发现每一个设备和操作系统对的行为都有所不同。所以虽然我没在机器人上见过这个,但我在其他手机上见过。如果可以跟踪是否已在侦听更新,请删除更新,然后再次请求更新。两种情况(多个请求vs请求/删除)都没有很好的文档记录。

10-08 18:12