在后台交流

本指南简要介绍了如何在应用在后台运行时支持与外围设备通信的关键用例:

有多种选项可支持上述每种应用场景。每种方法都有其优缺点,可能或多或少适合您的特定需求。

下图简要展示了本页中的指导:

查找设备

首先,您的应用需要找到要连接的设备。如需查找 BLE 设备,您可以使用以下任一 API:

在后台

当应用不可见时,使用这两个 API 没有任何限制,但它们都需要您的应用进程处于活跃状态。如果应用进程未运行,您可以使用以下解决方法:

连接到设备

如需在找到设备后连接到该设备,您需要从以下某个来源获取该设备的 BluetoothDevice 实例:

获得 BluetoothDevice 实例后,您可以通过调用其中一个 connectGatt() 方法,向相应设备发起连接请求。您传入 autoConnect 布尔值的值定义了 GATT 客户端使用以下哪种连接模式:

  • 直接连接 (autoconnect = false):尝试直接连接到外围设备,如果设备不可用,则连接失败。如果断开连接,GATT 客户端不会自动尝试重新连接。
  • 自动连接 (autoconnect = true):尝试在外围设备可用时自动连接到该设备。如果断开连接是由外围设备发起的,或者是因为外围设备超出范围,GATT 客户端会在外围设备可用时自动尝试重新连接。

在后台

应用在后台运行时,连接到设备没有任何限制,但如果进程被终止,连接就会关闭。此外,从后台启动 activity(在 Android 10 及更高版本中)或前台服务(在 Android 12 及更高版本中)也存在限制。

因此,如需在后台执行连接,应用可以使用以下解决方案:

与设备保持连接

理想情况下,应用应仅在必要时保持与外围设备的连接,并在任务完成后断开连接。不过,在以下两种情况下,应用可能需要无限期地保持连接:

在这两种情况下,您都可以使用以下选项:

在应用之间切换时

查找设备、连接到设备以及传输数据非常耗时且耗费资源。为避免连接断开,以及避免在用户每次切换应用或执行同步任务时都必须执行完整流程,您应在操作完成之前保持连接处于活跃状态。您可以使用类型为 connectedDevice 的前台服务,也可以使用配套设备在线状态 API。

在听取外围设备通知时

如需监听外围设备通知,应用必须调用 setCharacteristicNotification(),使用 onCharacteristicChanged() 监听回调,并保持连接处于活跃状态。对于大多数应用,最好使用 CompanionDeviceService 支持此用例,因为应用可能需要长时间保持监听。不过,您也可以使用前台服务。

在任一情况下,您都可以在进程终止后按照连接到设备部分中的说明重新连接。