Bluedroid框架
一.蓝牙主要涉及到的类
- BluetoothSettings.java
蓝牙配置和连接管理界面,就是咱们常见的蓝牙界面。它管理着蓝牙界面的加载,蓝牙搜索,蓝牙连接,蓝牙重命名等管理功能
- BluetoothEnable.java
蓝牙辅助类,用来管理蓝牙的开和关以及蓝牙状态的标题显示。如打开或关闭蓝牙的switchbar的状态和文本显示。
- DeviceListPreferenceFragment.java
BluetoothSettings类的父类,是一个抽象类,该类包含了用于保存蓝牙设备的链表以及蓝牙。同时实现BluetoothCallback接口,实现蓝牙设备的一些回调方法。
- BluetoothCallback.java
蓝牙设备的删除、扫描状态的改变、蓝牙状态的改变等回调抽象方法。
- CachedBluetoothDevice.java
缓存蓝牙设备,该类代表了一个远程设备,它包含了蓝牙设备的一些属性(例如蓝牙地址,名字,信号强度等)。该类还可以进行蓝牙设备的连接、配对、断开连接等功能。位于SettingsLib
- BluetoothDevice.java
表示远程蓝牙设备。 使用{@link BluetoothDevice}可以创建与相应设备的连接或查询有关它的信息,例如名称,地址,类和绑定状态。位于frameworks中
- BluetoothDevicePreference.java
在设置界面显示蓝牙设备的偏好类型。点击界面上的配对、连接、断开就是在这操作的。
- BluetoothAdapter.java
表示本地设备蓝牙适配器。 {@link BluetoothAdapter}允许您执行基本的蓝牙任务,例如启动设备发现,查询绑定(配对)设备列表,使用已知MAC地址实例化{@link BluetoothDevice},以及创建{@link BluetoothServerSocket} 监听来自其他设备的连接请求,并开始扫描蓝牙LE设备。位于frameworks中
- BluetoothEventManager.java
BluetoothEventManager从蓝牙API接收广播和回调,并将UI线程上的事件分派到设置中显示。位于SettingsLib
10.LocalBluetoothAdapter.java
蓝牙接口适配为本地的蓝牙接口适配器,为应用提供接口,同时调用BluetoothAdapter的接口,起到应用和底层的适配作用。
- CachedBluetoothDeviceManager.java
负责管理蓝牙的缓存(已配对的设备和搜索到的设备)主要都保存在List mCachedDevices中。位于SettingsLib
- LocalBluetoothProfileManager.java
提供访问有效的蓝牙协议对象LocalBluetoothProfile。位于SettingsLib
- BluetoothManager.java
高级管理员用于获取{@link BluetoothAdapter}的实例并进行整体蓝牙管理。
-
BluetoothManagerService.java
-
AdapterState.java
状态机处理蓝牙适配器状态
二.蓝牙开启流程
1.BluetoothEnabler.java—>onSwitchToggled()
开启和关闭蓝牙的switchbar的监听状态存在与BluetoothEnable类中,当点击switchbar时,由于BluetoothEnabler implements SwitchWidgetController.OnSwitchChangeListener ,所以会调用onSwitchToggled
更多具体流程如下
用户交互:打开蓝牙设置
用户通常通过以下几种方式打开蓝牙设置:
快捷方式:从顶部状态栏的快捷开关中打开蓝牙设置。
系统设置菜单:打开设置应用,选择 “蓝牙” 或 “连接设置”。
语音命令:通过 Google Assistant 或类似的语音助手执行蓝牙设置操作。
Activity 启动:启动 BluetoothSettingsActivity
用户点击蓝牙设置时,Android 系统启动一个 Activity 来展示蓝牙设置界面:
- 蓝牙设置的 Activity 通常是
BluetoothSettingsActivity
或BluetoothSettingsFragment
。 - Android 系统通过 Intent 触发这个 Activity。例如:
Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
startActivity(intent);
- 这会加载系统提供的蓝牙设置 UI。
Bluetooth Adapter 初始化
当蓝牙设置界面打开时,系统会检查当前蓝牙的状态(是否启用、连接设备、扫描状态等),并初始化核心的蓝牙组件——BluetoothAdapter
。
BluetoothAdapter
是 Android 系统提供的用于管理蓝牙操作的核心 API。- 在此时,
BluetoothAdapter
会被调用以检查当前蓝牙模块的状态,并获取设备信息。
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Bluetooth Manager & Bluetooth Service
BluetoothManager
是 Android 中用于管理蓝牙的核心系统服务。它通过后台的 BluetoothService 进行实际操作。
- BluetoothManager:负责管理所有蓝牙相关的操作,包含开启/关闭蓝牙、获取已配对设备、管理连接设备等。
- BluetoothService:运行在系统后台,管理所有蓝牙硬件操作及设备之间的通信。
服务调用流程: - BluetoothManager 通过调用 BluetoothService,检查蓝牙的当前状态,并将信息反馈给用户界面。
- 如果蓝牙未开启,系统会提示用户启用蓝牙,通常通过一个弹窗请求确认:
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
获取配对和已连接设备信息
在蓝牙设置页面加载时,系统会通过 BluetoothAdapter 获取当前已配对设备和已连接设备的列表,并将其显示在界面上。
- 系统调用 BluetoothAdapter.getBondedDevices() 获取已配对设备:
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
系统会展示设备的名称、MAC 地址等信息,同时显示设备的连接状态。
监听蓝牙状态变化
蓝牙设置页面通常需要监听蓝牙状态的实时变化,比如:
- 蓝牙启用/禁用的状态。
- 新设备被发现。
- 设备的连接状态变化(连接、断开连接)。
系统通过BroadcastReceiver
监听各种蓝牙相关的广播消息。常见的广播包括: BluetoothAdapter.ACTION_STATE_CHANGED
:蓝牙开启/关闭的状态变化。BluetoothDevice.ACTION_FOUND
:新设备被发现(扫描时)。BluetoothDevice.ACTION_BOND_STATE_CHANGED
:配对状态变化。
通过注册BroadcastReceiver
,蓝牙设置页面能够动态更新界面上的设备信息。
用户操作蓝牙设置
在蓝牙设置页面,用户可以执行以下操作:
- 开启/关闭蓝牙:用户通过界面上的开关启用或关闭蓝牙。这会触发对 BluetoothAdapter 的启用/关闭操作:
bluetoothAdapter.enable(); // 启用蓝牙
bluetoothAdapter.disable(); // 禁用蓝牙
- 扫描设备:用户点击 “扫描” 按钮,开始搜索周围的蓝牙设备。系统调用 BluetoothAdapter.startDiscovery() 以发现新设备。
- 配对设备:用户选择一个设备并配对。系统会执行蓝牙配对流程,并通过 PIN 码或配对请求进行确认。
- 连接设备:用户可以选择已配对的设备进行连接。常见的连接方式包括 A2DP(音频设备)和 HID(输入设备)等。
清理和关闭蓝牙设置
当用户退出蓝牙设置页面时,系统会清理与该页面相关的资源:
取消注册 BroadcastReceiver 以停止监听蓝牙状态变化。
如果正在执行设备扫描,系统会调用 BluetoothAdapter.cancelDiscovery()
以停止扫描操作。
总结
Bluetooth Settings 开启的流程大致如下:
1.用户通过各种方式打开蓝牙设置。
2. 启动 BluetoothSettingsActivity 并加载蓝牙界面。
3. 系统通过 BluetoothAdapter 和 BluetoothManager 获取当前的蓝牙状态和设备信息。
4. 系统展示已配对设备和连接状态。
5. 通过 BroadcastReceiver 监听蓝牙状态变化,并响应用户操作(如启用/禁用蓝牙、扫描设备等)。
6. 用户退出蓝牙设置时,系统清理相关资源。