本指南概述了如何在应用在后台运行时支持与外围设备通信的关键用例
有多种选项可以支持这些用例中的每一个。每种选项都有优点和缺点,可能使其或多或少适合你的特定需求。
下图显示了本页指南的简化视图
查找设备
首先,你的应用需要找到要连接的设备。要查找 BLE 设备,可以使用以下任一 API
BluetoothLeScanner
,如查找 BLE 设备中所述。(示例)CompanionDeviceManager
,如伴侣设备配对中所述。(示例)
在后台
在应用不可见时使用这些 API 没有任何限制,但它们都需要你的应用进程处于活动状态。如果应用进程未运行,可以使用以下解决方法
- 对于
BluetoothLeScanner
:调用startScan()
时使用PendingIntent
对象而不是ScanCallback
对象,以便在扫描到与你的过滤器匹配的设备时收到通知。(示例) - 对于
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 开始适用前台服务启动限制。
- 调用
startScan()
并传入PendingIntent
对象,如查找设备中所述,以便在设备存在时唤醒你的进程。外围设备必须正在广播。- 我们建议你启动 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
来支持此用例,因为应用可能需要长时间监听。但是,你也可以使用前台服务。
在任何一种情况下,你都可以按照连接到设备部分中的说明在进程终止后重新连接。