Как обнаружить изменения Bluetooth (состояние и характеристики подключения), когда приложение находится в фоновом режиме без службы переднего плана

У меня есть устройство, представляющее собой простое устройство BLE с кнопкой, и мне нужно определить, когда пользователь долго нажимает на устройство (путем изменения характеристик), даже когда приложение находится в фоновом режиме.

Этот щелчок вызовет удаленный вызов сервера.

У меня два вопроса по этому поводу:

# 1 Могу ли я добиться этого без службы переднего плана?

# 2 Если у меня есть служба переднего плана, работающая с обратными вызовами BLE GATT, как я могу определить, когда устройство снова находится в пределах досягаемости?

Мое текущее решение состоит в том, чтобы служба переднего плана всегда работала в фоновом режиме, но при этом пользователю потребуется постоянно отображаемое уведомление о приложении.


person Bruno Oliveira    schedule 12.08.2019    source источник
comment
По крайней мере, в более новых версиях Android пользователь может зайти в системные настройки, найти приложение и отключить уведомление службы переднего плана, если оно раздражает.   -  person Emil    schedule 13.08.2019


Ответы (1)


1: Да, вы можете добиться этого без использования службы переднего плана, используя JobIntentService.

Этот тип службы не требует отображения уведомления для вашего пользователя.

Чтобы узнать, когда была нажата кнопка устройства, служба JobIntentService может сканировать устройства BLE, и вы можете включить в данные BLE, рекламируемые вашим устройством, флаг или метку времени последнего нажатия.

Чтобы не разрядить батарею, я предлагаю вам не сканировать постоянно, а только несколько секунд каждую минуту.

2: Если ваш сканер BLE получает данные BLE, объявленные устройством, это означает, что устройство находится в пределах досягаемости.

person matdev    schedule 12.08.2019
comment
Я бы избегал JobIntentService для такого рода задач. Одна из причин заключается в том, что он содержит блокировку пробуждения, которая не позволяет ЦП перейти в спящий режим (по сравнению с запуском службы переднего плана вместо этого, когда чип Bluetooth будет пробуждать ЦП, когда что-то происходит). Также кажется, что вы можете запустить JobIntentService только на 10 минут (stackoverflow.com/questions/49254700/). - person Emil; 13.08.2019
comment
Я не рекомендую использовать JobIntentService для такого рода задач, просто отвечая на вопрос об альтернативе использованию службы переднего плана. Кроме того, если JobIntentService используется экономно, скажем, не более 5 или 10 секунд каждые 1 или 2 минуты, я думаю, что он может выполнить эту работу. - person matdev; 13.08.2019