本指南概述了当您的应用程序在后台运行时如何支持与外围设备通信的关键用例。
有多种选择可以支持这些用例中的每一个。每一个都有利弊,这可能使其或多或少适合您的特定需求。
下图显示了本页指南的简化视图
查找设备
首先,您的应用程序需要找到要连接的设备。要查找 BLE 设备,您可以使用以下任一 API
BluetoothLeScanner
,如 查找 BLE 设备 中所述。 (示例)CompanionDeviceManager
,如 配套设备配对 中所述。 (示例)
在后台
在应用程序不可见时,使用这两个 API 中的任何一个都没有限制,但它们都需要您的应用程序进程处于活动状态。如果应用程序进程未运行,您可以使用以下解决方法
- 对于
BluetoothLeScanner
: 使用PendingIntent
对象而不是ScanCallback
对象调用startScan()
,以便在扫描到与您的过滤器匹配的设备时收到通知。 (示例) - 对于
CompanionDeviceManager
: 按照 保持配套应用程序处于活动状态 中的指南,在以前关联的设备在范围内时唤醒应用程序并使其保持活动状态。 (示例)
连接到设备
要连接到已找到的设备,您需要从以下来源之一获取该设备的 BluetoothDevice
实例
- 如 上一节 所述的
BluetoothLeScanner
扫描结果。 - 从
BluetoothAdapter.getBondedDevices()
获取的已绑定设备列表。 - 使用
BluetoothAdapter.getRemoteLeDevice()
的BluetoothAdapter
缓存。
获得 BluetoothDevice
实例后,您可以通过调用其中一个 connectGatt()
方法,启动与对应设备的连接请求。传递到 autoConnect
布尔值中的值定义了 GATT 客户端使用的以下两种连接模式之一
- 直接连接 (
autoconnect = false
):尝试直接连接到外围设备,如果设备不可用则失败。如果断开连接,GATT 客户端不会自动尝试重新连接。 - 自动连接 (
autoconnect = true
):只要外围设备可用,就尝试自动连接到外围设备。如果外围设备发起了断开连接,或者外围设备超出了范围,则 GATT 客户端会在外围设备可用时自动尝试重新连接。
在后台
在应用程序处于后台时,连接到设备没有限制,尽管如果您的进程被杀死,连接将关闭。此外,在 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
支持此用例,因为应用程序很可能需要长时间监听。但是,您也可以使用前台服务。
在这两种情况下,您都可以按照 连接到设备 部分中的说明,在进程终止后重新连接。