Общение в фоновом режиме

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

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

На схеме ниже показано, как выбрать подходящий вариант.

Устройства

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

В фоновом режиме

Ограничений на использование этих API, когда приложение не видно, нет, но для их работы процесс приложения должен быть активен. Если процесс приложения не запущен, вы можете использовать следующие обходные решения:

Выберите устройство

Чтобы подключиться к устройству после того, как вы его нашли, вам нужно получить экземпляр BluetoothDevice для устройства из одного из следующих источников:

Получив экземпляр BluetoothDevice, вы можете запустить запрос на подключение к соответствующему устройству, вызвав один из методов connectGatt(). Логическое значение, которое вы передаете в autoConnect, определяет, какой из двух режимов подключения использует клиент GATT:

  • Прямое подключение (autoconnect = false). Попытаться подключиться к периферийному устройству напрямую. Если устройство недоступно, подключение не будет установлено. В случае отключения клиент GATT не пытается автоматически подключиться заново.
  • Автоматическое подключение (autoconnect = true). Попытка автоматически подключиться к периферийному устройству, когда оно доступно. Если отключение инициировано периферийным устройством или оно находится вне зоны действия, клиент GATT автоматически пытается повторно подключиться, когда периферийное устройство становится доступным.

В фоновом режиме

Ограничений на подключение к устройству, когда приложение работает в фоновом режиме, нет, но если процесс будет завершен, подключение закроется. Кроме того, в Android 10 и более поздних версиях действуют ограничения на запуск действий, а в Android 12 и более поздних версиях – ограничения на запуск активных служб из фонового режима.

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

Как оставаться на связи с устройством

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

В обоих случаях доступны следующие варианты:

При переключении между приложениями

Поиск устройства, подключение к нему и передача данных требуют времени и ресурсов. Чтобы избежать потери соединения и необходимости выполнять весь процесс каждый раз, когда пользователь переключается между приложениями или выполняет одновременные задачи, вы должны поддерживать соединение до завершения операции. Вы можете использовать активную службу с типом connectedDevice или Companion Device Presence API.

Во время прослушивания уведомлений от периферийных устройств

Чтобы получать уведомления от периферийного устройства, приложение должно вызвать метод setCharacteristicNotification(), прослушивать обратные вызовы с помощью onCharacteristicChanged() и поддерживать подключение. Для большинства приложений лучше всего поддерживать этот вариант использования с помощью CompanionDeviceService, поскольку приложению, скорее всего, потребуется продолжать прослушивание в течение длительного периода времени. Однако вы также можете использовать активную службу.

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