本指南简要介绍了如何在应用在后台运行时支持与外围设备通信的关键用例:
有多种选项可支持上述每种应用场景。每种方法都有其优缺点,可能或多或少适合您的特定需求。
下图简要展示了本页中的指导:

查找设备
首先,您的应用需要找到要连接的设备。如需查找 BLE 设备,您可以使用以下任一 API:
BluetoothLeScanner(如查找 BLE 设备中所述)。(示例)CompanionDeviceManager(如配套设备配对中所述)。 (示例)
在后台
当应用不可见时,使用这两个 API 没有任何限制,但它们都需要您的应用进程处于活跃状态。如果应用进程未运行,您可以使用以下解决方法:
- 对于
BluetoothLeScanner:使用PendingIntent对象(而非ScanCallback对象)调用startScan(),以便在扫描到与您的过滤条件匹配的设备时收到通知。(示例) - 对于
CompanionDeviceManager:请按照让配套应用保持唤醒状态中的指南,在之前关联的设备处于范围内时唤醒应用并使其保持唤醒状态。 (示例)
连接到设备
如需在找到设备后连接到该设备,您需要从以下某个来源获取该设备的 BluetoothDevice 实例:
BluetoothLeScanner扫描结果,如上一部分中所述。- 从
BluetoothAdapter.getBondedDevices()检索到的已绑定设备列表。 BluetoothAdapter缓存,使用BluetoothAdapter.getRemoteLeDevice()。
获得 BluetoothDevice 实例后,您可以通过调用其中一个 connectGatt() 方法,向相应设备发起连接请求。您传入 autoConnect 布尔值的值定义了 GATT 客户端使用以下哪种连接模式:
- 直接连接 (
autoconnect = false):尝试直接连接到外围设备,如果设备不可用,则连接失败。如果断开连接,GATT 客户端不会自动尝试重新连接。 - 自动连接 (
autoconnect = true):尝试在外围设备可用时自动连接到该设备。如果断开连接是由外围设备发起的,或者是因为外围设备超出范围,GATT 客户端会在外围设备可用时自动尝试重新连接。
在后台
应用在后台运行时,连接到设备没有任何限制,但如果进程被终止,连接就会关闭。此外,从后台启动 activity(在 Android 10 及更高版本中)或前台服务(在 Android 12 及更高版本中)也存在限制。
因此,如需在后台执行连接,应用可以使用以下解决方案:
- 使用 WorkManager 连接到您的设备。
- 您可以设置
PeriodicWorkRequest或OneTimeWorkRequest来执行定义的操作,但可能需要遵守应用限制。 - 此外,您还可以受益于 WorkManager 的工作约束条件、加急工作、重试政策等功能。
- 如果需要尽可能长时间地保持连接以执行任务(例如数据同步或从外围设备轮询),您需要按照支持长时间运行的工作器中的指南启动前台服务。不过,从 Android 12 开始,前台服务启动限制适用。
- 您可以设置
- 启动
connectedDevice类型的前台服务。- 如果需要尽可能长时间地保持连接以执行任务(例如数据同步或从外围设备轮询),您需要按照支持长时间运行的工作器中的指南启动前台服务。不过,从 Android 12 开始,前台服务启动限制适用。
- 使用
PendingIntent对象调用startScan()(如查找设备中所述),以便在设备存在时唤醒您的进程。外围设备必须正在通告。- 我们建议您启动一个 Worker 和一个 Job。这可能会被系统中断,因此只能支持短时间通信。
- 在低于 Android 12 的版本中,您可以直接从
PendingIntent对象启动前台服务。
- 使用
CompanionDeviceService以及REQUEST_COMPANION_RUN_IN_BACKGROUND或REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND权限从后台启动服务。
与设备保持连接
理想情况下,应用应仅在必要时保持与外围设备的连接,并在任务完成后断开连接。不过,在以下两种情况下,应用可能需要无限期地保持连接:
在这两种情况下,您都可以使用以下选项:
- 将
CompanionDeviceService与REQUEST_COMPANION_RUN_IN_BACKGROUND权限和CompanionDeviceManager.startObservingDevicePresence()方法搭配使用。 - 当应用在前台运行(或属于豁免情形之一)时,使用
connectedDevice前台类型启动前台服务。
在应用之间切换时
查找设备、连接到设备以及传输数据非常耗时且耗费资源。为避免连接断开,以及避免在用户每次切换应用或执行同步任务时都必须执行完整流程,您应在操作完成之前保持连接处于活跃状态。您可以使用类型为 connectedDevice 的前台服务,也可以使用配套设备在线状态 API。
在听取外围设备通知时
如需监听外围设备通知,应用必须调用 setCharacteristicNotification(),使用 onCharacteristicChanged() 监听回调,并保持连接处于活跃状态。对于大多数应用,最好使用 CompanionDeviceService 支持此用例,因为应用可能需要长时间保持监听。不过,您也可以使用前台服务。
在任一情况下,您都可以在进程终止后按照连接到设备部分中的说明重新连接。