Как сохранить фоновую службу gps живой

#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 (отказано в разрешении), возможно, это причина, по которой я ничего не получаю? В любом случае, если у вас есть какие-либо идеи о том, что происходит, я был бы очень признателен за любую помощь. Спасибо