开启关闭蓝牙
参考:https://www.jianshu.com/p/a150d55e29ca
开启过程
参考“Setting关于蓝牙的界面”,开启和关闭蓝牙的switchbar的监听状态是BluetoothEnable类,当打开switchbar时:
LocalBluetoothAdapter.setBluetoothEnabled()–>BluetoothAdapter.enable()–>BluetoothManagerService.enable()
BluetoothManagerService.sendEnableMsg()发送一个handler开启蓝牙的消息:
BluetoothManagerService.handler:
BMS.handleEnable() 只取了部分开启蓝牙的代码:
//Enable bluetooth
try {
if (!mQuietEnable) {
//开启蓝牙
if(!mBluetooth.enable()) {
Log.e(TAG,"IBluetooth.enable() returned false");
}
}
else {
if(!mBluetooth.enableNoAutoConnect()) {
Log.e(TAG,"IBluetooth.enableNoAutoConnect() returned false");
}
}
} catch (RemoteException e) {
Log.e(TAG,"Unable to call enable()",e);
}
接下来又调用了IBluetooth.enable(),具体实现是在AdapterService中,进而调用了AdapterService.enable()–>enable(boolean),代码如下:
接下来就到状态机AdapterState了。AdapterState状态机在AdapterService的onCreate方法中他通过一个静态函数AdapterState.make初始化。setInitialState()设置了该状态机的初始状态是OffState,AdapterState.BLE_TURN_ON消息由OffState首先处理:
第133行将状态机切换到PendingCommandState状态,然后调用processStart()
- 支持的profile service
- 初始化远程蓝牙设备
- 启动蓝牙绑定状态状态
- 将mBondStateMachine、mRemoteDevices传递给回调类JniCallbacks
- 向AdapterState发送STARTED,当前状态是PendingCommandState,所以:
调用Native层的enableNative()处理了(后续的文章再解析)。
Native层在蓝牙开启之后,蓝牙状态发生变化了,回调AdapterState.stateChangeCallback()
发送一个ENABLED_READY消息,因当前还处于PendingCommandState状态,所以:
先切换到OnState状态,然后发送一个BluetoothAdapter.STATE_ON广播,通知调用蓝牙的地方告诉它蓝牙状态已经改变,快做其它处理吧
下面就到了adapterservice里进行状态的更新了
上面的Callback到底跳到哪个地方了?答案就是又回到BluetoothManagerService里了,这个回调主要实现的功能就是发送一个蓝牙状态改变的广播。
被BluetoothManagerService.BluetoothHandler类处理,然后调用bluetoothStateChangeHandler()发送广播给所有应用:
Setting应用BluetoothEnabler在构造函数中注册了接收BluetoothAdapter.ACTION_STATE_CHANGED广播,所以会调用BluetoothEnabler.handleStateChanged()更新按键状态。
注意:我们在bluetoothStateChangeHandler()里面判断蓝牙打开还是关闭,然后做一些而外的处理,比如:
懒得画时序图了,顺便再借用以下别人的。
参考https://blog.youkuaiyun.com/pashanhu6402/article/details/79892807?spm=1001.2014.3001.5502
蓝牙关闭流程
这个就不贴代码详细介绍了,基本的流程和蓝牙开启基本上都是一个样,请自行分析源代码。
参考https://blog.youkuaiyun.com/pashanhu6402/article/details/79892807?spm=1001.2014.3001.5502