Каков наиболее эффективный способ использования LocationClient для периодической загрузки обновлений?

Я имею в виду наличие двух отдельных сигналов тревоги для сбора данных о местоположении пользователя каждый час, один из которых срабатывает каждые 59 минут для "подключения" клиента, а второй - для фактического определения местоположения и последующего отключения клиента.

Что касается времени автономной работы, стоит ли мне что-то еще делать, если выяснение местоположения пользователя будет основной утечкой приложения? Или есть другой подход к наличию двух сигналов тревоги? Первоначально у меня был только один сигнал тревоги, но выполнение (! MLocationClient.isConnected) проверки соединения не дает клиенту достаточно времени для подключения.

Спасибо за ваше понимание.

Два сигнала тревоги сработали бы примерно так:

private int PERIODIC_UPDATE = 60000*60;  //gets location and disconnects every hour
private int PERIODIC_RECONNECTION_UPDATE = 60000*59;  //connects 1 minute before getLocation call

    Timer toReconnect = new Timer();
    toReconnect.schedule(new TimerTask() {

        @Override
        public void run() {
            mLocationClient.connect();
        }
    }, 5000, PERIODIC_RECONNECTION_UPDATE);

    Timer theTimer = new Timer(); 
    theTimer.schedule(new TimerTask(){
        @Override
        public void run() {
            try {
                if(!mLocationClient.isConnected()) {
                    mLocationClient.connect();
                    //This will not have much affect because cannot so quickly, will remove. 
                }

                Location theLocation = mLocationClient.getLastLocation();
                if(theLocation!=null) {
                    checkPostLocation(theLocation); 

                    mLocationClient.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }   
        }}, 5000, PERIODIC_UPDATE);

2 ответа

Решение

Вам действительно нужно отслеживать пользователя?

Если речь идет только о пользовательском интерфейсе, используйте getLastKnownLocation(PASSIVE_PROVIDER), и вы должны получить что-то полуточное, если они используют службы определения местоположения на своем телефоне где-то еще.

Если вам нужно на самом деле триангулировать пользователя, помните, что разные провайдеры используют разные батареи. Пассивный <Сеть

Чем больше вы определяете местонахождение пользователя, тем больше батареи и времени отнимает GPS.

Запустите службу намеренно по одному расписанию, 1 час или еще, только одна необходимая услуга. Жить только максимум 1 минуту (или меньше), слушать всех провайдеров местоположения. После того, как минута или точность будут достаточно хороши, вы сохраните результат и отключите службу.

См. Раздел "Получение обновлений местоположения" в документации для разработчиков Android для подробного обсуждения этой темы с новым Fused LocationProvider:

http://developer.android.com/training/location/receive-location-updates.html

Это дает вам возможность зарегистрировать намерение с помощью LocationListener в Fused LocationProvider, который автоматически запускается внутренней структурой служб Google, когда это считается "эффективным". Я бы поверил, что эта инфраструктура имеет гораздо больший потенциал для оптимизации энергопотребления, поскольку в ней гораздо больше знаний о том, что еще происходит в системе, по сравнению с зарегистрированным приложением таймером.

Вот ваши варианты регистрации слушателя с разными уровнями приоритета мощности, что приведет к разным уровням разряда батареи, как указано в приведенных выше документах:

  • PRIORITY_BALANCED_POWER_ACCURACY - используется с setPriority(int) для запроса точности уровня "блока". Точность на уровне блока считается около 100 метров. Использование такой грубой точности часто потребляет меньше энергии.
  • PRIORITY_HIGH_ACCURACY - используется с setPriority(int) для запроса наиболее точных доступных местоположений. Это вернет самое лучшее доступное местоположение (и самый большой потенциал для утечки энергии).
  • PRIORITY_NO_POWER - используется с setPriority(int) для запроса максимальной точности при нулевом дополнительном потреблении энергии. Местоположение не будет возвращено, если другой клиент не запросил обновления местоположения, и в этом случае этот запрос будет действовать как пассивный прослушиватель этих местоположений.
Другие вопросы по тегам