повторно использовать startService () для отправки команд запущенному сервису - PullRequest
0 голосов
/ 28 апреля 2018

Я разрабатываю приложение, которое связывается со встроенным устройством через BLE (Bluetooth Low Energy). Приложение позволяет пользователю отправлять команды через деятельность. Между тем приложение должно отправлять данные о местоположении в фоновом режиме. Данные о местоположении должны отправляться постоянно, даже если действие закрыто и открыто несколько раз в течение дня.

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

После прочтения официального руководства (https://developer.android.com/guide/components/services#Basics), моей первой идеей было использование службы переднего плана, потому что служба не должна прерываться при закрытии действия. Это прекрасно работает для отправки данных о местоположении. Однако для отправки Команды, которые я должен связать со службой после ее запуска. Я прочитал, что не рекомендуется использовать оба параметра startService() и bindService(), но вместо этого принять решение об одном способе. Насколько я понял, связанная служба может быть уничтожена когда ссылочный контекст (активность в моем случае) разрушен, поэтому я думаю, что привязка к сервису не вариант для меня.

Другой подход к общению с запущенной службой - отправка команд с помощью широковещательных рассылок и их получение в службе ( отправка команд из Activity в Service в android ).

Но я думаю, что должно быть лучшее решение, которое я скучаю. Мне пришло в голову просто звонить startService() каждый раз, когда я хочу отправить команду Bluetooth. Я думаю, это будет работать. Но разве это хорошая практика? По сути, я бы звонил startService() десятки раз во время типичного случая использования, прежде чем звонить stopService().

.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Вам не нужно привязывать службу ни к чему. Достаточно запустить его, а затем убедиться, что вы вызываете startForeground на нем. Это будет поддерживать ваш процесс, не будучи убитым системой. Вам не нужно помещать свой BLE-код в класс обслуживания, но вы можете иметь его где угодно.

0 голосов
/ 28 апреля 2018

Ого ... Я прочитал все руководство, но пропустил это предложение в документации к методу:

StartService ()

Каждый вызов этого метода приведет к соответствующему вызову метода onStartCommand (Intent, int, int) целевой службы с намерением, указанным здесь. Это обеспечивает удобный способ отправки заданий в службу без привязки и вызова ее интерфейса.

https://developer.android.com/reference/android/content/Context#startService(android.content.Intent)

Надеюсь, это поможет в случае, если кто-то наткнется на него ..

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