Подтвердить что ты не робот

Использование службы посещений Google Play Services в фоновом режиме

Мое приложение предназначено для периодического отслеживания местоположения пользователя и отправки его на сервер. Недавно я изменил свой код с помощью API Google Play сервисов.

Я создал locationclient и подключился к службе в onStartCommand

public int onStartCommand(Intent intent, int flags, int startId) {
    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    mLocationClient.connect();
    return START_STICKY;

}

и в методе onConnected я отправляю запрос местоположения,

@Override
public void onConnected(Bundle arg0) {
    System.out.println("Connected ...");
    mLocationClient.requestLocationUpdates(REQUEST, this);

}

Объект REQUEST:

 private static final LocationRequest REQUEST = LocationRequest.create()
      .setInterval(5*60*1000)      // 5 minutes
      .setFastestInterval(3*60*1000) // 3 minutes
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

Теперь проблема:

  • метод onLocationChanged не вызывается на заданный интервал в течение 5 минут или самый быстрый интервал 3 минуты. Из журнала, который я видел, его вызов вызывали только дважды или трижды, после чего его вообще не вызывали (я проверил через 1 час).

В чем проблема с моим кодом? (Я также не видел никакого журнала для 'disconnected' также)

  • Чтобы решить эту проблему, я попытался использовать диспетчер будильника для вызова задачи периодически. Теперь, как получить одно обновление местоположения через LocationClient из трансляционного вещателя. (locationclient.getLastlocation() возвращает только последнее сохраненное местоположение, но не запрашивает новое местоположение)
4b9b3361

Ответ 1

Полный исходный код для справочной службы, доступной здесь:

https://gist.github.com/blackcj/20efe2ac885c7297a676

Попробуйте добавить супервызов к вашему onStartCommand.

/**
 * Keeps the service running even after the app is closed.
 * 
 */
public int onStartCommand (Intent intent, int flags, int startId)
{
    super.onStartCommand(intent, flags, startId);

    setUpLocationClientIfNeeded();
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting())
    {
        mLocationClient.connect();
    }

    return START_STICKY;
}