当前位置: 首页 > news >正文

【android bluetooth 框架分析 04】【bt-framework 层详解 4】【AdapterState介绍】

1. 问题

在蓝牙的启动过程中,我们会看到如下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 其实代表蓝牙启动过程中 各个状态。这篇文档我们大体介绍一下 在蓝牙服务启动的各个阶段,都做了那些事情。

如果你已经很清楚蓝牙启动过程中,各个阶段的处理。请忽略该篇内容。

2. AdapterState 介绍

在 AOSP(Android Open Source Project)中,AdapterState 是蓝牙系统服务的一部分,主要用于管理 蓝牙适配器(Bluetooth Adapter)的状态机,控制蓝牙从关闭到打开、BLE模式等不同状态的转换,并协调各子模块的初始化或清理流程。


1. 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)通知其他系统组件或应用

2.蓝牙 Adapter 的状态阶段说明

// android/app/src/com/android/bluetooth/btservice/AdapterState.javastatic 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.javaAdapterService.java 中定义):

状态说明主要工作触发事件
OFF蓝牙完全关闭清理所有蓝牙模块和资源
BLE_TURNING_ON开启 BLE 模式初始化 GattService、Native Stack,但不开启 Classic Profiles(如 A2DP、HFP)启动 AdapterService, 调用 JNI 的 enable()
BLE_ONBLE 模式开启蓝牙处于仅 BLE 可用状态(如用于 BLE 位置服务)可被系统用于 BLE Scanning、Gatt连接
TURNING_ON正在开启完整蓝牙(Classic + BLE)初始化 ProfileService(如 A2DP、HFP)、设置蓝牙名称、地址HAL 通知状态变化
ON完整蓝牙已开启所有模块初始化完毕,可连接经典蓝牙设备、进行配对、传输音频等广播 BluetoothAdapter.STATE_ON
TURNING_OFF正在关闭蓝牙依次关闭各服务,断开连接,释放资源HAL 通知状态变化
BLE_TURNING_OFFBLE 正在关闭停止 GattService,关闭 native 蓝牙堆栈最终进入 OFF 状态

3.蓝牙启动各阶段的详细流程与事件触发

以下是一个完整的蓝牙启动过程(由 BluetoothAdapter.enable() 触发):

1. 初始状态:OFF

  • 蓝牙未启动,所有模块未激活。
  • 用户调用 BluetoothAdapter.enable()
app 侧
  1. 当前蓝牙没有开启,蓝牙服务 进程 没有启动。此时用户需要打开蓝牙,调用如下。
BluetoothAdapter.enable()
// framework/java/android/bluetooth/BluetoothAdapter.javapublic boolean enable() {...try {return mManagerService.enable(mAttributionSource); // 这里调用 BluetoothManagerService.enable} catch (RemoteException e) {Log.e(TAG, "", e);}return false;}
  • 此时会 通过 IBluetoothManager.aidl 接口 调用到 framework 侧,也就是 system_server进程中。
system_server 侧
// service/java/com/android/server/bluetooth/BluetoothManagerService.javapublic 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.AdapterServiceIntent 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拉起来。

  • 在 使用 bindServiceAsUser 拉起 蓝牙服务时, 会将服务对应的 Ibind 接口通过 mConnection = new BluetoothServiceConnection() 返回给 system_server 侧。
bt.server 侧

此时我们的蓝牙服务 被拉起来了。

  • packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterService.java
public class AdapterService extends Service {// 根据服务的生命周期 此时就会触发调用 onCreate 方法public void onCreate() {...mAdapterStateMachine = AdapterState.make(this); // 这里会创建 AdapterState 对象...}}
// android/app/src/com/android/bluetooth/btservice/AdapterState.javaprivate 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 {@Overrideint getStateValue() {return BluetoothAdapter.STATE_OFF;}@Overridepublic 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;}}
  • 当 OffState 收到 BLE_TURN_ON 消息,将进入 TurningBleOn 状态

2. 进入 BLE_TURNING_ON

在该状态下 主要去 bringUpBle

  • 启动 AdapterService 和 JNI 层:

    • 启动 native 蓝牙堆栈
    • 初始化 GattService,用于 BLE 操作
  • 在收到 BLE_STARTED 事件后:AdapterState.BLE_TURNING_ONAdapterState.BLE_ON

system_server 侧

// 蓝牙服务 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: 101-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;// 蓝牙服务的 IbindermHandler.sendMessage(msg); // 发送 MESSAGE_BLUETOOTH_SERVICE_CONNECTED 消息}}
    private class BluetoothHandler extends Handler {@Overridepublic 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...}
bt.server 侧
// android/app/src/com/android/bluetooth/btservice/AdapterService.javapublic 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;}
  • android/app/src/com/android/bluetooth/btservice/AdapterState.java
private class TurningBleOnState extends BaseAdapterState {@Overrideint getStateValue() {return BluetoothAdapter.STATE_BLE_TURNING_ON;}@Overridepublic 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 }@Overridepublic void exit() {removeMessages(BLE_START_TIMEOUT);super.exit();}@Overridepublic 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 事件触发

3. 进入 BLE_ON

  • BLE 功能可用,但尚未初始化经典蓝牙模块。

  • 某些系统功能可以使用 BLE,比如:

    • BLE 广播

    • BLE 扫描

    • BLE 设备连接(如智能手环)

bt.server-jni 侧

当蓝牙协议栈初始化完后, 会调用 adapter_state_change_callback 函数,将状态告知 java 层

// android/app/jni/com_android_bluetooth_btservice_AdapterService.cppmethod_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);
}
bt.server-java侧
  • android/app/src/com/android/bluetooth/btservice/JniCallbacks.java
    void stateChangeCallback(int status) {mAdapterService.stateChangeCallback(status);}
  • android/app/src/com/android/bluetooth/btservice/AdapterService.java
    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_ONmAdapterStateMachine.sendMessage(AdapterState.BLE_STARTED);} else {Log.e(TAG, "Incorrect status " + status + " in stateChangeCallback");}}
  • android/app/src/com/android/bluetooth/btservice/AdapterState.java
    private class BleOnState extends BaseAdapterState {@Overrideint getStateValue() {return BluetoothAdapter.STATE_BLE_ON;}@Overridepublic 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 事件触发。

4. 进入 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 
system_server
  • 在 使用 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;// 蓝牙服务的 IbindermHandler.sendMessage(msg); // 发送 MESSAGE_BLUETOOTH_SERVICE_CONNECTED 消息}}
  • service/java/com/android/server/bluetooth/BluetoothManagerService.java
    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_IBLUETOOTHbreak;}}}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;}// 可以重点看一下这个函数 isBluetoothPersistedStateOnBluetoothif (isBluetoothPersistedStateOnBluetooth() || !isBleAppPresent()) {// This triggers transition to STATE_ONsynchronousOnLeServiceUp(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);}
bt.server 侧
  • android/app/src/com/android/bluetooth/btservice/AdapterService.java
        public void onLeServiceUp(AttributionSource source, SynchronousResultReceiver receiver) {try {onLeServiceUp(source);receiver.send(null);} catch (RuntimeException e) {receiver.propagateException(e);}}@VisibleForTestingvoid 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 }
  • android/app/src/com/android/bluetooth/btservice/AdapterState.java
private class TurningOnState extends BaseAdapterState {@Overrideint getStateValue() {return BluetoothAdapter.STATE_TURNING_ON;}@Overridepublic void enter() {super.enter();sendMessageDelayed(BREDR_START_TIMEOUT, BREDR_START_TIMEOUT_DELAY);mAdapterService.startProfileServices(); // 在 TurningOnState 中,这里会去触发 启动经典蓝牙所支持的所有 profile. 例如 a2dpsink avrcp hidhost hiddevice hfp pbap 等协议的 profile.}@Overridepublic void exit() {removeMessages(BREDR_START_TIMEOUT);super.exit();}@Overridepublic 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 触发

5. 最终状态:ON

  • 所有蓝牙功能可用

  • 广播 BluetoothAdapter.ACTION_STATE_CHANGED -> STATE_ON

  • 应用可以进行设备扫描、连接、配对、媒体传输等

bt.server
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: 1201-02 04:40:09.214157  2259  2259 D BluetoothAdapterService: processProfileServiceStateChanged: AvrcpControllerService, state: 1201-02 04:40:09.229984  2259  2259 D BluetoothAdapterService: processProfileServiceStateChanged: HeadsetClientService, state: 1201-02 04:40:09.230174  2259  2259 D BluetoothAdapterService: processProfileServiceStateChanged: HidDeviceService, state: 1201-02 04:40:09.231042  2259  2259 D BluetoothAdapterService: processProfileServiceStateChanged: HidHostService, state: 1201-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 
  • android/app/src/com/android/bluetooth/btservice/AdapterService.java
        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 -> ONmBtCompanionManager.loadCompanionInfo();}break;
  • android/app/src/com/android/bluetooth/btservice/AdapterState.java
    private class OnState extends BaseAdapterState {@Overrideint getStateValue() {return BluetoothAdapter.STATE_ON;}@Overridepublic 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;}}

4.状态转换示意图

     OFF↓ enable()
BLE_TURNING_ON↓BLE_ON↓ enable()
TURNING_ON↓ON

关闭时则反过来:

     ON↓ disable()
TURNING_OFF↓BLE_ON↓ disable()
BLE_TURNING_OFF↓OFF

5.这样设计的目的

这套状态设计出发点有以下几个核心目标:

目的解释
模块化启动BLE 和 Classic Bluetooth 独立初始化,适应不同场景需求(如只用 BLE)
节能优化系统可以在只需要 BLE 时不启动经典蓝牙,降低功耗
稳定性每个状态有明确职责,便于状态机管理和问题排查
热切换能力支持动态切换 BLE-only 模式和 Full Bluetooth 模式(如配合飞行模式等)
事件驱动每个状态变更都伴随事件广播,方便应用和其他系统服务感知状态变化

6.典型应用场景举例

  • 手表只用 BLE 配对手机:仅进入 BLE_ON 状态,不激活 A2DP 等模块,节省资源。
  • 车载系统准备连接手机 A2DP:必须进入 ON 状态,完整启动蓝牙协议栈。
  • 手机开机自启蓝牙:系统层在启动流程中逐步激活 AdapterService,进入 ON 状态。

相关文章:

  • git撤回commit
  • 流批一体向量化引擎Flex
  • 前端面试六之axios
  • 黑马教程强化day2-2
  • markdown文本转换时序图
  • 深入理解 TCP 套接字:Socket 编程入门教程
  • 数组方法_push()/pop()/数组方法_shift()/unshift()
  • 滚动—横向滚动时,如何直接滚动到对应的内容板块
  • `document.domain` API 的废弃与现代 Web 开发的转型
  • 从 8 秒到 1 秒:前端性能优化的 12 个关键操作
  • Maven 构建性能优化深度剖析:原理、策略与实践
  • CKA考试知识点分享(10)---NetworkPolicy
  • 深入浅出:C++深拷贝与浅拷贝
  • Web防火墙深度实战:从漏洞修补到CC攻击防御
  • 重拾前端基础知识:CSS预处理器
  • 基于AI智能体的医疗AI工具库构建路径分析
  • Python爬虫(54)Python数据治理全攻略:从爬虫清洗到NLP情感分析的实战演进
  • 第七章: SEO与渲染方式 三
  • C#接口代码记录
  • 第七章: SEO与渲染方式
  • 自己架设网站服务器/2021年新闻摘抄
  • 企业网站开发建设委托合同/危机舆情公关公司
  • wordpress js被挂木马/win10优化大师好用吗
  • 网站建设测试验收报告/做微商如何引流推广怎么找客源
  • 阿联酋网站后缀/seo快照推广
  • 购物网站的基本功能/新闻热点事件2021(最新)