基于Android P版本分析
状态机
AdapterService 状态机
从蓝牙开启的流程上看,整体的状态机流转图如上;
| STATE | VALUE | DESC |
|---|---|---|
| STATE_OFF | 10 | 蓝牙模块处于关闭状态 |
| STATE_TURNING_ON | 11 | 蓝牙模块正在打开 |
| STATE_ON | 12 | 蓝牙模块处于开启状态 |
| STATE_TURNING_OFF | 13 | 蓝牙模块正在关闭 |
| STATE_BLE_TURNING_ON | 14 | 低功耗蓝牙模块正在打开 |
| STATE_BLE_ON | 15 | 低功耗蓝牙模块处于开启状态 |
| STATE_BLE_TURNING_OFF | 16 | 低功耗蓝牙模块正在关闭 |
主要是描述了蓝牙开关状态信息;
对应的上述状态在各个情况下的一个跳转逻辑;
在各个状态下能够响应的指令划分,基本上每一个message对应一个transitionTo指令,用于跳转到执行的状态下;
在进入到下一个状态的时候,在每一个State中都存在一个enter方法,这个方法类似于类构造函数,只要调用了transitionTo方法之后,在刚刚进入新的状态的时候首先执行enter方法,这个方法中一般会执行一些对应状态下需要初始化或者是配置操作;
A2DP 状态机
大致的connect过程分为3步,初始化状态为Disconnected;
| STATE | DESC |
|---|---|
| Disconnected | 蓝牙A2DP模块未连接 |
| Connecting | 蓝牙A2DP模块正在连接 |
| Disconnecting | 蓝牙A2DP模块正在断连 |
| Connected | 蓝牙A2DP模块已连接 |
主要是描述了A2DP Service中状态信息;
主要包括4种状态,每种状态都可以响应Message和Event,这个和AdapterService模块的状态机有一点不一样的地方,AdapterService模块状态机不支持Event事件的响应;
- 绿色:代表了该状态支持的Message
- 橘色:代表了该状态支持的Event
- 红色:代表了对应场景下的响应指令,即状态跳转指令
A2DP Service模块的状态机只包含了4个状态,有些Service模块对应的状态机状态是比较多的,例如HeadsetService;
其中框选中的代表该状态支持跳转到两个不同的状态;
A2dpsink 状态机
| STATE | DECS |
|---|---|
| Disconnected | 未连接状态 |
| Pending | 等待状态 |
| Connected | 已连接状态 |
描述了3个状态之间的跳转逻辑;
描述了哪些状态可以进行状态机跳转,同时整理了3个状态对应可以响应的Message和Event;
在A2dpSink的Connected状态中,其中支持了很多AVRCP的指令,这些指令的响应都在A2dpSinkStreamHandler中进行指令处理。本质上就是对AVRCP协议的控制;
AvrcpController 状态机
AVRCP(音视频远程控制协议)子协议的作用是支持CT(主动发起端)控制TG(目标设备),例如手机连接车载蓝牙之后,车载蓝牙就可以控制手机的播放、暂停、切歌以及获取手机上播放歌曲的信息,如专辑、歌名、歌手、时长等信息;
AVRCP协议定义了蓝牙设备和audio/video控制功能通信的特点和过程;
AvrcpController的状态和上述的状态有一点不一样的地方,就是该状态中存在两个主状态,而Connected状态下又存在6个子状态机,这样设计的目的就是,这6个状态的基状态都是Connected,一些公共的操作可以放置到Connected状态进行处理,而对应各个子状态的操作处理可以由对应的子状态机处理,不影响基状态;
| STATE | PARENT_STATE | DECS |
|---|---|---|
| Disconnected | 未连接状态 | |
| Connected | 已连接状态 | |
| SetBrowsedPlayer | Connected | 设置浏览播放器状态 |
| SetAddresedPlayerAndPlayItem | Connected | 设置地址播放器和播放项 |
| ChangeFolderPath | Connected | 文件夹路径变化状态 |
| GetFolderList | Connected | 获取文件夹列表状态 |
| GetPlayerListing | Connected | 获取播放器清单状态 |
| MoveToRoot | Connected | 移动到主目录状态 |
将所有的Message划分到这6个状态中,在指定的STATE下对应的不同的Message集合;
描述了所有状态下所支持的所有的Message;
HearingAidStackEvent 状态机
HearingAidStackEvent 的状态机基本上和A2DP的状态机类似;
| STATE | DESC |
|---|---|
| Disconnected | 蓝牙HearingAid模块未连接 |
| Connecting | 蓝牙HearingAid模块正在连接 |
| Disconnecting | 蓝牙HearingAid模块正在断连 |
| Connected | 蓝牙HearingAid模块已连接 |
Headset 状态机
| STATE | DECS |
|---|---|
| Disconnected | 未连接状态 |
| Connecting | 正在连接状态 |
| Disconnecting | 正在断开连接状态 |
| Connected | 已连接状态 |
| AudioOn | 音频工作状态 |
| AudioConnecting | 音频正在连接状态 |
| AudioDisconnecting | 音频正在断开状态 |
基本上,各个模块对应的状态机都是类似的,都是支持Message和Event的指令触发;
Headset Client 状态机
| STATE | DECS |
|---|---|
| Disconnected | 未连接状态 |
| Connecting | 正在连接状态 |
| Connected | 已连接状态 |
| AudioOn | 音频工作状态 |
MapClient 状态机
| STATE | DECS |
|---|---|
| Disconnected | 未连接状态 |
| Connecting | 正在连接状态 |
| Connected | 已连接状态 |
| Disconnecting | 正在断开连接状态 |
MapClient的状态机和其余的状态不同的地方在于,该状态机的初始化状态位Connecting;