Периодическое отслеживание местоположения на переднем плане на Android

Я нахожусь в процессе создания пользовательского плагина Phonegap для Android, который отслеживает местоположение как когда приложение находится на переднем плане, так и когда оно находится в фоновом режиме. Документация Google по использованию FusedLocationProviderAPI удивительно ясно. Процесс, который я разработал до сих пор, выглядит следующим образом

  • Убедитесь, что API доступен

    GoogleApiAvailability api = GoogleApiAvailability.getInstance();
    int code = api.isGooglePlayServicesAvailable(ctxt);
    return (code == ConnectionResult.SUCCESS); 
    
  • Определите LocationListener с назначенными обратными вызовами для обработки результатов, возвращенных методом requestLocationUpdates.

  • Создать запрос местоположения

Здесь все становится немного неясным

  1. setInterval — интервал, с которым приложение требует обновления местоположения.
  2. setFastestInterval — интервал, с которым будут потребляться обновления, если они доступны.
  3. setSmallestDistance и setPriorty - достаточно ясно
  4. setNumUpdates - как это работает мне непонятно. Читая между строк, я предполагаю, что если я использую setInterval(60000) и setNumUpdates(1000), система будет продолжать отправлять обновления местоположения в течение следующих 6000 минут или до тех пор, пока приложение не будет отключено в фоновом режиме или я/пользователь не отменит обновления местоположения.

Но тогда возникает вопрос: что должно делать приложение, чтобы быть хорошим гражданином? Я предполагаю, что должно быть что-то вроде этого

  • Запишите PendingResult, возвращаемый вызовом requestLocationUpdates.
  • Обнаружение, когда происходит событие onPause
  • вызовите PendingResultt.cancel(), прежде чем позволить приложению перейти в фоновый режим

Я был бы очень признателен, если бы кто-нибудь мог прокомментировать правильность этого рабочего процесса.

Связанная проблема: документация для PendingResult штатов

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

Мне непонятно, о каких ресурсах здесь идет речь. Событие LocationListener.onLocationChanged возвращает объект Location, который, как я предполагаю, будет удален сборщиком мусора, когда он выйдет за пределы области видимости. Предположительно, PendingResult, возвращаемое requestLocationUpdates, должно быть отменено, а затем установлено значение null, когда приложение переходит в фоновый режим. Есть ли что-то еще, что нужно сделать для высвобождения ресурсов?


Несколько часов спустя

Я создал две версии своего тестового приложения

  • Приложение 1: настраивает запрос местоположения с помощью setNumUpdates(10000). Всплывающие всплывающие уведомления об изменении местоположения в форме Приложение 1:Местоположение...
  • Приложение 2: настраивает запрос местоположения с помощью setNumUpdates(1). Всплывающие всплывающие уведомления об изменении местоположения в виде Приложение 2`:Местоположение...

Я запустил два приложения одновременно и смоделировал изменения положения с помощью действительно аккуратного небольшого приложения под названием FakeGPS. И App1, и App2 предоставили мне обновление, когда я сделал свое первое поддельное изменение местоположения. Однако обо всех последующих изменениях местоположения сообщало только Приложение 1.

Таким образом, setNumUpdates предоставляет механизм для периодического опроса обновлений. Что немного сбивает с толку, так это то, что обновления продолжаются даже после того, как приложение находится в фоновом режиме, хотя я предполагаю, что это в значительной степени связано с тем, что оно находится во власти ОС, которая убьет его, когда сочтет нужным.

Однако все вышеизложенное основано на эмпирической проверке. Я нахожу на удивление мало в настройке setNumUpdates.


person DroidOS    schedule 06.05.2016    source источник
comment
Вы отменили регистрацию обновлений местоположения, когда App1 переходит в фоновый режим? Если нет, вы будете получать обновления до тех пор, пока платформа не обнаружит, что количество обновлений достигло значения, установленного App1.   -  person siva    schedule 10.05.2016
comment
Вы правы - когда приложение становится фоновым, я должен отменить регистрацию этого обновления местоположения и настроить другое с PendingIntent вместо LocationListener. Я пытался сделать это, выпустив PendingResult.cancel() из события onPause, но ясно, что это не то, что требуется - документы предлагают FusedLocationAPI.removeLocation.... Однако это по-прежнему не отвечает на вопросы, которые я здесь задавал, включая роль setNumUpdates, которую я установил эмпирически, но не могу найти никакой документации.   -  person DroidOS    schedule 11.05.2016


Ответы (1)


На ваш вопрос, продолжается ли обновление, даже если приложение находится в фоновом режиме: Ответ: в любом случае setNumUpdates равно 1 или x, когда ваше приложение находится в фоновом режиме и все еще зарегистрировано для обновления, вы будете получать обновления, если ОС не имеет убил ваше приложение, на память. Единственная разница, которую делает setNumUpdates, заключается в том, что, как вы правильно сказали, если для него установлено значение 1, он даст только одно обновление, если вы не перерегистрируетесь снова. Ссылка имеет достаточное определение для setNumUpdates https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#public-methods

person Ashish Rawat    schedule 11.05.2016