Android 9 原生设置关于蓝牙设置(三)

开启关闭蓝牙

参考: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()
在这里插入图片描述

  1. 支持的profile service
  2. 初始化远程蓝牙设备
  3. 启动蓝牙绑定状态状态
  4. 将mBondStateMachine、mRemoteDevices传递给回调类JniCallbacks
  5. 向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.csdn.net/pashanhu6402/article/details/79892807?spm=1001.2014.3001.5502
在这里插入图片描述

蓝牙关闭流程

这个就不贴代码详细介绍了,基本的流程和蓝牙开启基本上都是一个样,请自行分析源代码。
参考https://blog.csdn.net/pashanhu6402/article/details/79892807?spm=1001.2014.3001.5502
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/suwen8100/article/details/126704793