在蓝牙的启动过程中,我们会看到如下log:
01-02 04:40:07.206918 2259 2658 I AdapterState0: OFF : entered
01-02 04:40:07.348232 2259 2658 I AdapterState0: BLE_TURNING_ON : entered
01-02 04:40:09.013738 2259 2658 I AdapterState0: BLE_ON : entered
01-02 04:40:09.042387 2259 2658 I AdapterState0: TURNING_ON : entered
01-02 04:40:09.238341 2259 2658 I AdapterState0: ON : entered
这些 log 其实代表蓝牙启动过程中 各个状态。这篇文档我们大体介绍一下 在蓝牙服务启动的各个阶段,都做了那些事情。
如果你已经很清楚蓝牙启动过程中,各个阶段的处理。请忽略该篇内容。
在 AOSP(Android Open Source Project)中,AdapterState
是蓝牙系统服务的一部分,主要用于管理 蓝牙适配器(Bluetooth Adapter)的状态机,控制蓝牙从关闭到打开、BLE模式等不同状态的转换,并协调各子模块的初始化或清理流程。
AdapterState
类的作用AdapterState
是 AOSP 中 Bluetooth 服务模块的一部分,位于:
/packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterState.java
主要职责:
功能 | 说明 |
---|---|
状态机管理 | 管理 Bluetooth Adapter 的生命周期状态(如 OFF、BLE_ON、ON 等) |
事件驱动 | 接收上层请求(如 enable/disable),并分发到底层组件(如 JNI/HAL) |
模块协调 | 协调 AdapterService、ProfileService、GattService 等模块初始化或停止 |
蓝牙状态广播 | 根据状态变化发送系统广播(如 ACTION_STATE_CHANGED )通知其他系统组件或应用 |
// android/app/src/com/android/bluetooth/btservice/AdapterState.java
static final int USER_TURN_ON = 1;
static final int USER_TURN_OFF = 2;
static final int BLE_TURN_ON = 3;
static final int BLE_TURN_OFF = 4;
static final int BREDR_STARTED = 5;
static final int BREDR_STOPPED = 6;
static final int BLE_STARTED = 7;
static final int BLE_STOPPED = 8;
static final int BREDR_START_TIMEOUT = 9;
static final int BREDR_STOP_TIMEOUT = 10;
static final int BLE_STOP_TIMEOUT = 11;
static final int BLE_START_TIMEOUT = 12;
static final int NEW_ADAPTER_STATE_CHANGED = 13;
static final int NEW_ADAPTER_ENABLE_TIMEOUT = 14;
static final int NEW_ADAPTER_DISABLE_TIMEOUT = 15;
蓝牙状态是一个状态机,核心状态有以下几种(在 AdapterState.java
和 AdapterService.java
中定义):
状态 | 说明 | 主要工作 | 触发事件 |
---|---|---|---|
OFF |
蓝牙完全关闭 | 清理所有蓝牙模块和资源 | 无 |
BLE_TURNING_ON |
开启 BLE 模式 | 初始化 GattService、Native Stack,但不开启 Classic Profiles(如 A2DP、HFP) | 启动 AdapterService , 调用 JNI 的 enable() |
BLE_ON |
BLE 模式开启 | 蓝牙处于仅 BLE 可用状态(如用于 BLE 位置服务) | 可被系统用于 BLE Scanning、Gatt连接 |
TURNING_ON |
正在开启完整蓝牙(Classic + BLE) | 初始化 ProfileService(如 A2DP、HFP)、设置蓝牙名称、地址 | HAL 通知状态变化 |
ON |
完整蓝牙已开启 | 所有模块初始化完毕,可连接经典蓝牙设备、进行配对、传输音频等 | 广播 BluetoothAdapter.STATE_ON |
TURNING_OFF |
正在关闭蓝牙 | 依次关闭各服务,断开连接,释放资源 | HAL 通知状态变化 |
BLE_TURNING_OFF |
BLE 正在关闭 | 停止 GattService,关闭 native 蓝牙堆栈 | 最终进入 OFF 状态 |
以下是一个完整的蓝牙启动过程(由 BluetoothAdapter.enable()
触发):
OFF
BluetoothAdapter.enable()
。BluetoothAdapter.enable()
// framework/java/android/bluetooth/BluetoothAdapter.java
public boolean enable() {
...
try {
return mManagerService.enable(mAttributionSource); // 这里调用 BluetoothManagerService.enable
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
return false;
}
// service/java/com/android/server/bluetooth/BluetoothManagerService.java
public class BluetoothManagerService extends IBluetoothManager.Stub {
public boolean enable(AttributionSource attributionSource) throws RemoteException {
...
synchronized (mReceiver) {
...
// 这里最终会触发 发送 MESSAGE_ENABLE 事件
sendEnableMsg(false,
BluetoothProtoEnums.ENABLE_DISABLE_REASON_APPLICATION_REQUEST, packageName);
}
...
return true;
}
private void sendEnableMsg(boolean quietMode, int reason, String packageName, boolean isBle) {
// 发送 MESSAGE_ENABLE 事件
mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_ENABLE, quietMode ? 1 : 0,
isBle ? 1 : 0));
addActiveLog(reason, packageName, true);
mLastEnabledTime = SystemClock.elapsedRealtime();
}
private class BluetoothHandler extends Handler {
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_ENABLE:
...
handleEnable(mQuietEnable); // 打开蓝牙
...
break;
}
}
}
private void handleEnable(boolean quietMode) {
...
bindToAdapter();
...
}
private BluetoothServiceConnection mConnection = new BluetoothServiceConnection();
private void bindToAdapter() {
// com.android.bluetooth/.btservice.AdapterService
Intent intent = new Intent(getBluetoothClassName());
Log.d(TAG, "Start binding to the Bluetooth service with intent=" + intent);
mContext.bindServiceAsUser(intent, mConnection, flags, user); // 此时系统会自动将我们的蓝牙服务拉起来
}
}
system_server 最终会通过 bindServiceAsUser 将我们的蓝牙服务进程com.android.bluetooth/.btservice.Adapterservice
拉起来。
此时我们的蓝牙服务 被拉起来了。
public class AdapterService extends Service {
// 根据服务的生命周期 此时就会触发调用 onCreate 方法
public void onCreate() {
...
mAdapterStateMachine = AdapterState.make(this); // 这里会创建 AdapterState 对象
...
}
}
// android/app/src/com/android/bluetooth/btservice/AdapterState.java
private AdapterState(AdapterService service) {
super(TAG);
addState(mOnState);
addState(mBleOnState);
addState(mOffState);
addState(mTurningOnState);
addState(mTurningOffState);
addState(mTurningBleOnState);
addState(mTurningBleOffState);
if (isDualAdapterMode()) {
addState(mNewAdapterState);
}
mAdapterService = service;
mAdapterIndex = AdapterUtil.getAdapterIndex();
setInitialState(mOffState); // 这里默认的状态就是 OFF 状态
}
private class OffState extends BaseAdapterState {
@Override
int getStateValue() {
return BluetoothAdapter.STATE_OFF;
}
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case BLE_TURN_ON:
transitionTo(mTurningBleOnState);
break;
default:
infoLog("Unhandled message - " + messageString(msg.what));
return false;
}
return true;
}
}
BLE_TURNING_ON
在该状态下 主要去 bringUpBle
启动 AdapterService 和 JNI 层:
在收到 BLE_STARTED 事件后:AdapterState.BLE_TURNING_ON
→ AdapterState.BLE_ON
// 蓝牙服务 onBind 调用 将返回 Ibinder 接口
01-02 04:40:07.311987 2259 2259 D BluetoothAdapterService: onBind()
// 此时 system_server 收到 IBinder 回调 BluetoothServiceConnection
01-02 04:40:07.312698 1686 1686 D BluetoothManagerService: BluetoothServiceConnection: com.android.bluetooth.btservice.AdapterService
// 触发 MESSAGE_BLUETOOTH_SERVICE_CONNECTED 消息
01-02 04:40:07.312920 1686 2033 D BluetoothManagerService: MESSAGE_BLUETOOTH_SERVICE_CONNECTED: 1
01-02 04:40:07.322022 2259 2322 D BluetoothAdapter: onBluetoothServiceUp: com.android.bluetooth.btservice.AdapterService$AdapterServiceBinder@ee20315
01-02 04:40:07.327105 2259 2340 D BluetoothAdapterService: getSupportedProfiles
// 触发 蓝牙服务的 enable 接口
01-02 04:40:07.347695 2259 2340 D BluetoothAdapterService: enable() - Enable called with quiet mode status = false
在 使用 bindServiceAsUser 拉起 蓝牙服务时, 会将服务对应的 Ibind 接口通过 mConnection = new BluetoothServiceConnection() 返回给 system_server 侧。
当 system_server 侧监听到 BluetoothAdapterService 服务已经启动:
service/java/com/android/server/bluetooth/BluetoothManagerService.java
private class BluetoothServiceConnection implements ServiceConnection {
public void onServiceConnected(ComponentName componentName, IBinder service) {
...
if (DBG) {
Log.d(TAG, "BluetoothServiceConnection: " + name);
}
Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_CONNECTED);
if (isServiceIBluetooth(name)) {
msg.arg1 = SERVICE_IBLUETOOTH; // 这里 表示 BluetoothAdapterService: onBind 已经返回了 IBinder了
} else if (isServiceIBluetoothGatt(name)) {
msg.arg1 = SERVICE_IBLUETOOTHGATT; // 这里表示 GattService: onBind 已经返回了 Ibinder 了
} else {
Log.e(TAG, "Unknown service connected: " + name);
return;
}
msg.obj = service;// 蓝牙服务的 Ibinder
mHandler.sendMessage(msg); // 发送 MESSAGE_BLUETOOTH_SERVICE_CONNECTED 消息
}
}
private class BluetoothHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {
...
synchronousEnable(mQuietEnable, mContext.getAttributionSource());
...
break;
}
}
}
}
private IBluetooth mBluetooth;
private boolean synchronousEnable(boolean quietMode, AttributionSource attributionSource)
throws RemoteException, TimeoutException {
...
mBluetooth.enable(quietMode, attributionSource, recv); // 调用 AdapterService.enable
...
}
// android/app/src/com/android/bluetooth/btservice/AdapterService.java
public synchronized boolean enable(boolean quietMode) {
debugLog("enable() - Enable called with quiet mode status = " + quietMode);
mQuietmode = quietMode;
mAdapterStateMachine.sendMessage(AdapterState.BLE_TURN_ON); // 此时 将 触发 AdapterState 从 OFF -> BLE_TURNING_ON
return true;
}
private class TurningBleOnState extends BaseAdapterState {
@Override
int getStateValue() {
return BluetoothAdapter.STATE_BLE_TURNING_ON;
}
@Override
public void enter() {
super.enter();
final int timeoutDelay = SystemProperties.getInt(
BLE_START_TIMEOUT_DELAY_PROPERTY, BLE_START_TIMEOUT_DELAY);
Log.d(TAG, "Start Timeout Delay: " + timeoutDelay);
sendMessageDelayed(BLE_START_TIMEOUT, timeoutDelay);
mAdapterService.bringUpBle(); // 在 TurningBleOnState 主要去 启动 ble
}
@Override
public void exit() {
removeMessages(BLE_START_TIMEOUT);
super.exit();
}
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case BLE_STARTED:
transitionTo(mBleOnState);
break;
case BLE_START_TIMEOUT:
errorLog(messageString(msg.what));
transitionTo(mTurningBleOffState);
break;
default:
infoLog("Unhandled message - " + messageString(msg.what));
return false;
}
return true;
}
}
BLE_TURNING_ON -> BLE_ON
需要 BLE_STARTED
事件触发BLE_ON
BLE 功能可用,但尚未初始化经典蓝牙模块。
某些系统功能可以使用 BLE,比如:
BLE 广播
BLE 扫描
BLE 设备连接(如智能手环)
当蓝牙协议栈初始化完后, 会调用 adapter_state_change_callback 函数,将状态告知 java 层
// android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp
method_stateChangeCallback =
env->GetMethodID(jniCallbackClass, "stateChangeCallback", "(I)V");
static void adapter_state_change_callback(bt_state_t status) {
CallbackEnv sCallbackEnv(__func__);
if (!sCallbackEnv.valid()) return;
ALOGV("%s: Status is: %d", __func__, status);
sCallbackEnv->CallVoidMethod(sJniCallbacksObj, method_stateChangeCallback,
(jint)status);
}
void stateChangeCallback(int status) {
mAdapterService.stateChangeCallback(status);
}
void stateChangeCallback(int status) {
if (status == AbstractionLayer.BT_STATE_OFF) {
debugLog("stateChangeCallback: disableNative() completed");
mAdapterStateMachine.sendMessage(AdapterState.BLE_STOPPED);
} else if (status == AbstractionLayer.BT_STATE_ON) {
// 此时在这里 将下发 BLE_STARTED 事件, 这就使得 BLE_TURNING_ON -> BLE_ON
mAdapterStateMachine.sendMessage(AdapterState.BLE_STARTED);
} else {
Log.e(TAG, "Incorrect status " + status + " in stateChangeCallback");
}
}
private class BleOnState extends BaseAdapterState {
@Override
int getStateValue() {
return BluetoothAdapter.STATE_BLE_ON;
}
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case USER_TURN_ON:
transitionTo(mTurningOnState);
break;
case BLE_TURN_OFF:
transitionTo(mTurningBleOffState);
break;
default:
infoLog("Unhandled message - " + messageString(msg.what));
return false;
}
return true;
}
}
BLE_ON -> TURNNING_ON
需要 USER_TURN_ON
事件触发。TURNING_ON
调用 JNI 层请求打开 Classic 模块。
初始化 ProfileServices(如 A2DP、HFP、PBAP 等)
加载配对信息、设置蓝牙名称、地址
HAL 层返回状态(通过事件通知)
// bt.server 中, GattService 启动
01-02 04:40:09.023532 2259 2259 D GattService: onBind
// sytem_server 此时监听到
01-02 04:40:09.039431 1686 2033 D BluetoothManagerService: MESSAGE_BLUETOOTH_SERVICE_CONNECTED: 2
01-02 04:40:09.039653 1686 2033 D BluetoothManagerService: continueFromBleOnState()
// 触发 bt.server 此时切换到 TURNING_ON 状态
01-02 04:40:09.042387 2259 2658 I AdapterState0: TURNING_ON : entered
在 使用 bindServiceAsUser 拉起 蓝牙服务时, 会将服务对应的 Ibind 接口通过 mConnection = new BluetoothServiceConnection() 返回给 system_server 侧。
当 system_server 侧监听到 GattService 服务已经启动:
service/java/com/android/server/bluetooth/BluetoothManagerService.java
private class BluetoothServiceConnection implements ServiceConnection {
public void onServiceConnected(ComponentName componentName, IBinder service) {
...
if (DBG) {
Log.d(TAG, "BluetoothServiceConnection: " + name);
}
Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_CONNECTED);
if (isServiceIBluetooth(name)) {
msg.arg1 = SERVICE_IBLUETOOTH; // 这里 表示 BluetoothAdapterService: onBind 已经返回了 IBinder了
} else if (isServiceIBluetoothGatt(name)) {
msg.arg1 = SERVICE_IBLUETOOTHGATT; // 这里表示 GattService: onBind 已经返回了 Ibinder 了
} else {
Log.e(TAG, "Unknown service connected: " + name);
return;
}
msg.obj = service;// 蓝牙服务的 Ibinder
mHandler.sendMessage(msg); // 发送 MESSAGE_BLUETOOTH_SERVICE_CONNECTED 消息
}
}
private class BluetoothHandler extends Handler {
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: {
if (DBG) {
Log.d(TAG, "MESSAGE_BLUETOOTH_SERVICE_CONNECTED: " + msg.arg1);
}
IBinder service = (IBinder) msg.obj;
try {
mBluetoothLock.writeLock().lock();
if (msg.arg1 == SERVICE_IBLUETOOTHGATT) { // 如果是 GattService 已经启动
mBluetoothGatt = getBluetoothGatt(service);
continueFromBleOnState(); // 这里会继续触发 从 BleOn 状态出发到一下个状态
break;
} // else must be SERVICE_IBLUETOOTH
break;
}
}
}
private void continueFromBleOnState() {
if (DBG) {
Log.d(TAG, "continueFromBleOnState()");
}
try {
mBluetoothLock.readLock().lock();
if (mBluetooth == null) {
Log.e(TAG, "onBluetoothServiceUp: mBluetooth is null!");
return;
}
if (!mEnableExternal && !isBleAppPresent()) {
Log.i(TAG, "Bluetooth was disabled while enabling BLE, disable BLE now");
mEnable = false;
synchronousOnBrEdrDown(mContext.getAttributionSource());
return;
}
// 可以重点看一下这个函数 isBluetoothPersistedStateOnBluetooth
if (isBluetoothPersistedStateOnBluetooth() || !isBleAppPresent()) {
// This triggers transition to STATE_ON
synchronousOnLeServiceUp(mContext.getAttributionSource()); // 这里会触发 开启 经典蓝牙
persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH);
}
} catch (RemoteException | TimeoutException e) {
Log.e(TAG, "Unable to call onServiceUp", e);
} finally {
mBluetoothLock.readLock().unlock();
}
}
/**
* Returns true if the Bluetooth saved state is BLUETOOTH_ON_BLUETOOTH
*/
private boolean isBluetoothPersistedStateOnBluetooth() {
if (!supportBluetoothPersistedState()) {
return false;
}
/*
这里会从 Settings的ContentResolver 获取 bluetooth_on 字段, 如果是 BLUETOOTH_ON_BLUETOOTH 表示支持 开启 经典蓝牙。
但是 如果获取不到 里面的值, 默认也是 BLUETOOTH_ON_BLUETOOTH
所以 这里不用特意配置, 默认就是支持 打开 经典蓝牙的。
如果你的项目上只需要 ble 。 可以在这里 做文章。这样蓝牙协议栈就不会继续 去 初始化经典蓝牙。
*/
return Settings.Global.getInt(mContentResolver, Settings.Global.BLUETOOTH_ON,
BLUETOOTH_ON_BLUETOOTH) == BLUETOOTH_ON_BLUETOOTH;
}
private void synchronousOnLeServiceUp(AttributionSource attributionSource)
throws RemoteException, TimeoutException {
if (mBluetooth == null) return;
final SynchronousResultReceiver recv = SynchronousResultReceiver.get();
mBluetooth.onLeServiceUp(attributionSource, recv); // 这里继续调用 蓝牙服务的 onLeServiceUp 接口
recv.awaitResultNoInterrupt(getSyncTimeout()).getValue(null);
}
public void onLeServiceUp(AttributionSource source, SynchronousResultReceiver receiver) {
try {
onLeServiceUp(source);
receiver.send(null);
} catch (RuntimeException e) {
receiver.propagateException(e);
}
}
@VisibleForTesting
void onLeServiceUp(AttributionSource source) {
AdapterService service = getService();
if (service == null
|| !callerIsSystemOrActiveOrManagedUser(service, TAG, "onLeServiceUp")
|| !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
return;
}
enforceBluetoothPrivilegedPermission(service);
service.mAdapterStateMachine.sendMessage(AdapterState.USER_TURN_ON); // 这里下发了 USER_TURN_ON 消息, 此时 AdapterState 状态,就从 BLE_ON -> TURNNING_ON
}
private class TurningOnState extends BaseAdapterState {
@Override
int getStateValue() {
return BluetoothAdapter.STATE_TURNING_ON;
}
@Override
public void enter() {
super.enter();
sendMessageDelayed(BREDR_START_TIMEOUT, BREDR_START_TIMEOUT_DELAY);
mAdapterService.startProfileServices(); // 在 TurningOnState 中,这里会去触发 启动经典蓝牙所支持的所有 profile. 例如 a2dpsink avrcp hidhost hiddevice hfp pbap 等协议的 profile.
}
@Override
public void exit() {
removeMessages(BREDR_START_TIMEOUT);
super.exit();
}
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case BREDR_STARTED:
handleOn();
transitionTo(mOnState); // 如果要从 TURNNING_ON -> ON 需要 BREDR_STARTED 触发
break;
case BREDR_START_TIMEOUT:
errorLog(messageString(msg.what));
transitionTo(mTurningOffState);
break;
default:
infoLog("Unhandled message - " + messageString(msg.what));
return false;
}
return true;
}
private void handleOn() {
if (isDualAdapterMode() &&
mAdapterService.canEnableNewAdapter()) {
mPendingOn = true;
transitionTo(mNewAdapterState);
} else {
transitionTo(mOnState);
}
}
}
TURNNING_ON -> ON
需要 BREDR_STARTED
触发ON
所有蓝牙功能可用
广播 BluetoothAdapter.ACTION_STATE_CHANGED -> STATE_ON
应用可以进行设备扫描、连接、配对、媒体传输等
01-02 04:40:09.042387 2259 2658 I AdapterState0: TURNING_ON : entered
// 经典蓝牙对应的 profile 启动
01-02 04:40:09.208223 2259 2259 D BluetoothAdapterService: processProfileServiceStateChanged: A2dpSinkService, state: 12
01-02 04:40:09.214157 2259 2259 D BluetoothAdapterService: processProfileServiceStateChanged: AvrcpControllerService, state: 12
01-02 04:40:09.229984 2259 2259 D BluetoothAdapterService: processProfileServiceStateChanged: HeadsetClientService, state: 12
01-02 04:40:09.230174 2259 2259 D BluetoothAdapterService: processProfileServiceStateChanged: HidDeviceService, state: 12
01-02 04:40:09.231042 2259 2259 D BluetoothAdapterService: processProfileServiceStateChanged: HidHostService, state: 12
01-02 04:40:09.231235 2259 2259 D BluetoothAdapterService: processProfileServiceStateChanged: PbapClientService, state: 12
// 当所有 profile 启动后, 将 切换到 ON
01-02 04:40:09.238341 2259 2658 I AdapterState0: ON : entered
private void processProfileServiceStateChanged(ProfileService profile, int state) {
Log.d(TAG, "processProfileServiceStateChanged: " + profile.getName() + ", state: " + state);
switch (state) {
case BluetoothAdapter.STATE_ON:
if (!mRegisteredProfiles.contains(profile)) {
Log.e(TAG, profile.getName() + " not registered (STATE_ON).");
return;
}
if (mRunningProfiles.contains(profile)) {
Log.e(TAG, profile.getName() + " already running.");
return;
}
mRunningProfiles.add(profile);
if (isGattService(profile.getName())) {
enableNative();
} else if (mSupportedProfileClass.size() == mRunningProfiles.size()) {
updateUuids();
setBluetoothClassFromConfig();
initProfileServices();
getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_LOCAL_IO_CAPS);
getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_LOCAL_IO_CAPS_BLE);
getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_DYNAMIC_AUDIO_BUFFER);
mAdapterStateMachine.sendMessage(AdapterState.BREDR_STARTED); // 发送 BREDR_STARTED 消息, 此时将从 TRUNING_ON -> ON
mBtCompanionManager.loadCompanionInfo();
}
break;
private class OnState extends BaseAdapterState {
@Override
int getStateValue() {
return BluetoothAdapter.STATE_ON;
}
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case USER_TURN_OFF:
transitionTo(mTurningOffState);
break;
default:
infoLog("Unhandled message - " + messageString(msg.what));
return false;
}
return true;
}
}
OFF
↓ enable()
BLE_TURNING_ON
↓
BLE_ON
↓ enable()
TURNING_ON
↓
ON
关闭时则反过来:
ON
↓ disable()
TURNING_OFF
↓
BLE_ON
↓ disable()
BLE_TURNING_OFF
↓
OFF
这套状态设计出发点有以下几个核心目标:
目的 | 解释 |
---|---|
模块化启动 | BLE 和 Classic Bluetooth 独立初始化,适应不同场景需求(如只用 BLE) |
节能优化 | 系统可以在只需要 BLE 时不启动经典蓝牙,降低功耗 |
稳定性 | 每个状态有明确职责,便于状态机管理和问题排查 |
热切换能力 | 支持动态切换 BLE-only 模式和 Full Bluetooth 模式(如配合飞行模式等) |
事件驱动 | 每个状态变更都伴随事件广播,方便应用和其他系统服务感知状态变化 |