#android #background #gps
#Android #фон #gps
Вопрос:
Я пытаюсь использовать фоновый прослушиватель местоположения gps в качестве службы, которая может использоваться всеми действиями в моем приложении. Он также должен сканировать местоположения, пока я не «убью» его. Однако я понял, что через пару часов служба gps отключается, и я больше не могу получать местоположения.
Как мне поддерживать эту службу в рабочем состоянии (по крайней мере, LocationManager и location listener), пока я не захочу ее отключить?
Спасибо
public class GPS extends IntentService {
public static LocationListener loc_listener = null;
public static LocationManager locationManager = null;
public GPS() {
super("GPS");
}
@Override
protected void onHandleIntent(Intent intent) {
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (loc_listener == null) {
loc_listener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}
};
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, loc_listener);
}
public static void killGPS() {
if (locationManager != null amp;amp; loc_listener != null) {
locationManager.removeUpdates(loc_listener);
}
}
}
Ответ №1:
Однако я понял, что через пару часов служба gps отключается, и я больше не могу получать местоположения.
Во-первых, это исключительно плохая идея постоянно включать GPS, так как время автономной работы пользователя значительно сократится. Ваше приложение должно предлагать огромную ценность (например, Google Navigation), чтобы оправдать эти затраты на электроэнергию.
Во-вторых, никогда не регистрируйте слушателя из an IntentService
. После onHandleIntent()
завершения служба завершает работу… но вы пропускаете своего зарегистрированного слушателя. Это эффективно поддерживает фоновый поток. Однако, поскольку у вас нет активных компонентов, Android в конечном итоге завершит ваш процесс.
Комментарии:
1. Это для тестирования, я настрою его позже, чтобы сделать его более экономичным. Если регистрация слушателя из IntentService не подходит, должен ли я открыть слушателя из activity? Если да, то как я могу настроить его так, чтобы я мог держать его включенным в течение нескольких минут, прежде чем записывать местоположение, а затем выключать его?
2. @Sean:
Service
в этом случае используйте обычный. Зарегистрируйте слушателяonStartCommand()
. Когда поступит исправление или возникнет какое-либо условие ожидания, отмените регистрацию слушателя и вызовитеstopSelf()
. Вы можете увидеть пример этого с моимLocationPoller
компонентом ( github.com/commonsguy/cwac-locpoll ), хотя это предназначено для случаев, когда это не обязательно действие.3. Привет, я пытался реализовать ваш пример, но, похоже, я никогда не могу получить класс locationReceiver. В журнале я вижу ошибку FileNotFoundException (отказано в разрешении), возможно, это причина, по которой я ничего не получаю? В любом случае, если у вас есть какие-либо идеи о том, что происходит, я был бы очень признателен за любую помощь. Спасибо