Я разрабатываю приложение, которое должно каждые 2 минуты сохранять данные о GPS-положении устройства.
Первой попыткой было использовать requestLocationUpdates:
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000L, 0f, this);
Для тестирования я использую Samsung Galaxy Mini (Android 2.3.5).
Если я провожу тест в режиме отладки с подключенным USB-кабелем, все работает идеально, каждые две минуты я получаю позицию .
Проблема когда отключаю USB и иду на улицу тестировать. Таким образом я получаю координаты GPS каждую секунду. Это слишком.
После долгого просмотра кода я решил использовать таймер:
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run() {
Location loc=getLastBestLocation(Activity.this);
GpsStore.save(loc);
}
}, 120000L, 120000L);
Опять же, если тестировать приложение в режиме отладки с помощью USB-кабеля, все идет нормально.
Если я выхожу и пройду тест, если приложение находится на переднем плане, все идет хорошо, если приложение находится в фоновом режиме, TimerTask не запускается каждые 2 минуты он останавливается, и когда приложение возвращается на передний план, внезапно все время запускается TimerTask, который он выполнял нормально. Но все быстро, примерно за 1 секунду.
Опять же, после долгого просмотра моего кода, я решил использовать вместо Timer Handler:
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
Location loc=getLastBestLocation(Activity.this);
GpsStore.save(loc);
handler.removeCallbacks(this);
handler.postDelayed(this,120000L);
}
};
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 120000L);
Как всегда все отлично работает в режиме отладки с USB. Что происходит сейчас, когда я провожу тест на улице, так это то, что, когда приложение находится на переднем плане, обработчик не запускается ровно каждые 2 минуты, иногда делает это каждые 4 раза в 1, но когда приложение находится в фоновом режиме, в порядке Runnable using Обработчик не запускается каждые 2 минуты, никогда не запускается.
Я бы использовал только requestLocationUpdates, но он вызывается каждую секунду.
Мне нужна ваша помощь. Спасибо.