Остановка обновлений местоположения правильно, отказоустойчивая

Пожалуйста, рассмотрите этот фрагмент кода:

public class Presence implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener
{
          :
          :
    boolean pref_auto_mode;
          :
          :
    private Presence(Context context)
    {
        this.context = context;
        getAppSettings();

        gApiClient = new GoogleApiClient.Builder(context, this, this)
                .addApi(LocationServices.API)
                .build();
        createLocationRequest();
        if (!gApiClient.isConnecting() && !gApiClient.isConnected())
        {
            gApiClient.connect();
        }
    } // of constructor

    @Override
    public void onConnected(Bundle connectionHint)
    {
        Log.e(LOG_TAG, "In onConnected(), gApiClient.isConnected(): " + gApiClient.isConnected());
        createLocationRequest();
        getLocation();
        getSubLocality();

        if (pref_auto_mode)
            startLocationUpdates();
    } // of onConnected()
          :
          :
    private void getAppSettings()
    {
        // Get the user's preferences
        APP_USER_SETTINGS =     PreferenceManager.getDefaultSharedPreferences(context);

                :        
                :        
        pref_auto_mode = APP_USER_SETTINGS.getBoolean(Contract.PREF_AUTO_MODE, false);
                :        
    } // of getAppSettings()

} // of class Presence

Это работает, как и ожидалось.

В том же классе Presence выше я пытаюсь остановить обновление местоположения, когда пользователь отключает определенный параметр, с помощью следующего метода:

public void stopLocationUpdates()
{
    if (gApiClient.isConnected())
    {
        LocationServices.FusedLocationApi.removeLocationUpdates(gApiClient, pendingIntent);
        LocationServices.FusedLocationApi.removeLocationUpdates(gApiClient, this);

        Log.e(LOG_TAG, "Location tracker stopped successfully.");

        requestingLocationUpdates = false;
    }
}

Я вижу Toast. Обновлений местоположения нет, и все молчит, как и ожидалось. Но после пары часов перемещения с устройством я внезапно снова начинаю получать обновления местоположения, например, весь код в onHandleIntent() из IntentService точно выполняется при изменении местоположения.

Чтобы установить автоматический режим, пользователь должен запустить приложение, поэтому класс Presence обязательно будет создан (Singleton), и все, что установлено в приложении, отражается на его флаге pref_auto_mode, если я не неправильный. Тем не менее, я подозреваю этот флаг.

Пожалуйста, дайте мне знать, что еще мне нужно сделать, чтобы мгновенно остановить обновление местоположения и продолжить его таким образом< /strong> пока пользователь не включит настройку? Я что-то делаю не так или что-то упускаю?

Спасибо заранее!


person Narayana J    schedule 15.06.2016    source источник
comment
Служба намерений уничтожается после завершения выполнения своей задачи, поэтому, если у вас есть какой-либо диспетчер местоположений, он тоже будет убит, поэтому вам, вероятно, следует перейти на обычную службу для вашего диспетчера местоположений.   -  person tyczj    schedule 15.06.2016
comment
Спасибо @tyczj, у меня нет LocationManager в IntentService. Мне очень нужно поведение IntentService, и все работает нормально, за исключением остановки обновлений местоположения...   -  person Narayana J    schedule 15.06.2016
comment
я говорю, что если вы пытаетесь получить обновления местоположения в службе намерений, это не сработает. пожалуйста, уточните, пытаетесь ли вы это сделать, и если нет, то почему вы пытаетесь остановить это в службе намерений, а не там, где у вас запущены обновления местоположения   -  person tyczj    schedule 15.06.2016
comment
ваш код выглядит примерно так? stackoverflow.com/questions/30141631/ также , покажите, где в вашем коде вы запрашиваете обновления местоположения....   -  person Daniel Nugent    schedule 15.06.2016
comment
Извините, @tyczj, думаю, информация в исходном вопросе была неполной. Пожалуйста, смотрите обновленный вопрос. Чтобы конкретно ответить на ваш вопрос, НЕТ, я не получаю обновления местоположения в IntentService и НЕТ, я не останавливаю обновления в IntentService   -  person Narayana J    schedule 15.06.2016
comment
Проверяете ли вы настройки пользователя перед вызовом FusedLocationApi.requestLocationUpdates()?   -  person Daniel Nugent    schedule 15.06.2016
comment
Да, @DanielNugent, в слушателе onSharedPreferenceChanged() основного действия и в onResume() основного действия.   -  person Narayana J    schedule 15.06.2016
comment
Пожалуйста, позвольте мне быть еще более точным. Делает ли stopLocationUpdates() выше все, что нужно, чтобы остановить обновление местоположения, или он что-то упускает? Потому что я считаю, что все остальное работает так, как ожидалось...   -  person Narayana J    schedule 15.06.2016
comment
Покажите, где вы устанавливаете/получаете/используете SharedPreference для этого параметра, и покажите весь код переопределения onConnected(), где вы запрашиваете обновления местоположения   -  person Daniel Nugent    schedule 15.06.2016
comment
@DanielNugent, извините за предоставление кода только по запросу. Пожалуйста, просмотрите обновленный вопрос. Спасибо!   -  person Narayana J    schedule 16.06.2016
comment
Поместите Toast в корпус if (pref_auto_mode) для тестирования, вы должны убедиться, что он никогда не попадет туда, когда параметр отключен.   -  person Daniel Nugent    schedule 16.06.2016


Ответы (1)


Спасибо всем, кто просмотрел код и предоставил ценные указания.

Мне пришлось сделать еще одну переменную поля boolean stopLocationTrackerRequired и установить ее в переопределении onSharedPreferenceChanged(). Только если этот флаг установлен, вызывается stopLocationUpdates() класса Presence и наверняка отключает обновления местоположения.

Для полноты:

  • Пожалуйста, дайте мне знать, что еще мне нужно сделать, чтобы мгновенно остановить обновление местоположения и сохранить его таким, пока пользователь не включит настройку?
  • Я что-то делаю не так или что-то упускаю?
  • stopLocationUpdates() делает все необходимое для достижения функциональности.
  • Мне действительно интересно, но немного большего контроля, как показано выше, не хватало
person Narayana J    schedule 17.06.2016