在后台交流

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

您可以通过多种方式支持每种使用情形。每种方法都有优点和缺点,可能更适合或不太适合您的具体需求。

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

寻找心仪设备

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

在后台

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

连接到设备

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

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

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

在后台

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

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

保持与设备的连接

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

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

在应用之间切换时

查找设备、连接到设备和传输数据非常耗时且耗资源。为避免连接中断,并避免每次用户在应用之间切换或执行同时执行的任务时都必须执行完整流程,您应在操作完成之前保持连接。您可以使用类型为 connectedDevice 的前台服务,也可以使用配套设备感知 API

在监听外围设备通知时

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

无论是哪种情况,您都可以在终止进程后按照连接到设备部分中的说明重新连接。