Я нахожусь в процессе создания пользовательского плагина Phonegap для Android, который отслеживает местоположение как когда приложение находится на переднем плане, так и когда оно находится в фоновом режиме. Документация Google по использованию FusedLocationProviderAPI удивительно ясно. Процесс, который я разработал до сих пор, выглядит следующим образом
Убедитесь, что API доступен
GoogleApiAvailability api = GoogleApiAvailability.getInstance(); int code = api.isGooglePlayServicesAvailable(ctxt); return (code == ConnectionResult.SUCCESS);
Определите LocationListener с назначенными обратными вызовами для обработки результатов, возвращенных методом
requestLocationUpdates
.- Создать запрос местоположения
Здесь все становится немного неясным
setInterval
— интервал, с которым приложение требует обновления местоположения.setFastestInterval
— интервал, с которым будут потребляться обновления, если они доступны.setSmallestDistance
иsetPriorty
- достаточно ясно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
.
FusedLocationAPI.removeLocation...
. Однако это по-прежнему не отвечает на вопросы, которые я здесь задавал, включая роль setNumUpdates, которую я установил эмпирически, но не могу найти никакой документации. - person DroidOS   schedule 11.05.2016