Android LocationManager忽略了requestLocationUpdates调用中的更改,但仅限于Droid

时间:2010-06-10 15:51:05

标签: android gps

在我正在开发的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);
    }
}

现在,这在大多数情况下都有效。我没有得到双重更新(即我没有先取消注册它仍然可以解决问题),在我的Nexus One和G1上,根据需要在背景和前台模式之间正确切换。也就是说,它会在尝试获得另一个位置修复之前等待大约30秒(给予或接受),从而节省电池电量。

当我在摩托罗拉Droid上测试时出现问题。在Droid上和它本身,一旦我把它放在后台模式,它将在修复之间等待30秒(再次,给予或采取),但如果它以这种方式获得至少一个修复,它将不会返回以后到前台模式。也就是说,即使在我重新进入需要和请求前台模式的实际应用程序之后,它仍然每次修复等待30秒,除了关闭Servicemajig并重新启动它之外,我似乎无法解决这个问题。日志显示它正在通过代码的这一部分,因此它至少可以实现这一点。

所以我的问题是,这只是Droid固件特有的错误吗?有什么方法可以解决这个问题吗?或者这甚至是做这样的事情的正确方法?我会注意到,如果我在带有registerLocationUpdates调用的if块之前添加removeUpdates调用并不重要。

1 个答案:

答案 0 :(得分:0)

这可能听起来很愚蠢,但每个设备和操作系统对的行为方式与我发现的不同。所以虽然我没有在Droid上看过这个,但我已经在其他手机上看过了。如果您可以跟踪是否已经在监听更新,请删除更新,然后再次请求更新。无论是哪种情况(多个请求与请求/删除)都没有真正记录好。