Я сделал что-то вроде этого:
У меня был LocationService (расширяет Service
и реализует LocationListener
).и я добавил
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1, 1, this);
и в onLocationChangedListener:
public void onLocationChanged(Location location) {
AlarmManager aleManager = (AlarmManager) LocationService.context.getSystemService(ALARM_SERVICE);
//Change the values of MINIMIUM_TRIGGER_TIME and INTERVAL_TIME
Intent forceLoc = new Intent(LocationService.context,
ForceLocationService.class);
PendingIntent pendingForceLoc = PendingIntent.getService(
LocationService.context, 0, forceLoc,
PendingIntent.FLAG_ONE_SHOT);
// CANCEL PREVIOUS alarm and set new one
aleManager.cancel(pendingForceLoc);
aleManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
MINIMIUM_TRIGGER_TIME, INTERVAL_TIME, pendingForceLoc);
}
и в ForceLocationService (extends IntentService
) запускаем обычный слушатель местоположения следующим образом:
locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService);
Это позволяет мне сделать следующее:
Если система получает какое-либо обновление местоположения до того, как alarmManager запустит ForceLocationService, она автоматически получит обновление и сбросит аварийный сигнал.
Если до срабатывания будильника обновление не происходит, то срабатывает срабатывание будильника, что гарантирует получение обновления при необходимости.
Единственная проблема, с которой я столкнулся, это то, что она не работает, если нет изменений в местоположении, потому что сброс тревоги сделан в onLocationChanged ().