В приложении для Android, которое я разрабатываю, мне нужен LocationManager, чтобы он исправлял местоположение. Эта часть хороша и хороша; это работает, это было в течение достаточно долгого времени, и все счастливы там.
Однако теперь, когда я также недавно добавил функцию, позволяющую компоненту отслеживания местоположения переходить в фоновый режим, я также хочу разрешить ему замедлять обновления в этом случае для экономии заряда батареи. По сути, я пытаюсь это сделать, переиздавая запрос requestLocationUpdates с новыми параметрами, если моя фоновая служба обнаруживает, что слушатели больше не зарегистрированы (она предоставляет что-то для панели уведомлений, поэтому я все еще хочу, чтобы она получала обновления). Назовем эту услугу «Сервисмаджиг». То, как я это делаю, вкратце:
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 секунд (дать или взять), прежде чем пытаться получить другое определение местоположения, сохраняя заряд батареи.
Проблема возникает, когда я тестирую ее на Motorola Droid. На Droid и только на нем, как только я переведу его в фоновый режим, он будет ждать 30 секунд (снова, давать или брать) между исправлениями, но если он получит хотя бы одно исправление таким образом, он не вернется в режим переднего плана позже. То есть, даже после того, как я повторно вошел в реальное приложение, где режим переднего плана желаемый и запрошенный, он все еще ждет 30 секунд на исправление, и я не могу обойти это, кроме как выключить Servicemajig и перезапустить его. Журналы показывают, что он проходит через эту часть кода, так что, по крайней мере, он далеко зашёл.
Так что мой вопрос, это просто ошибка, характерная для прошивки Droid? Есть ли способ, как я могу обойти это? Или это даже правильный способ сделать что-то подобное? Отмечу, что не имеет значения, если я добавлю вызов removeUpdates до блока if с вызовами registerLocationUpdates.