今天晓东和大家来一起看一下Android4.0中蓝牙适配器(Bluetooth Adapter)的状态机变化的过程。首先,我们需要了解一下,蓝牙适配器究竟有哪些状态,从代码可以清晰地看到(frameworks/base/core/java/android/server/bluetoothadapterstatemachine.java):
BluetoothAdapterStateMachine(Context context, BluetoothService bluetoothService,
BluetoothAdapter bluetoothAdapter) {
……
//bluetooth adapter的六个状态
mBluetoothOn = new BluetoothOn();
mSwitching = new Switching();
mHotOff = new HotOff();
mWarmUp = new WarmUp();
mPowerOff = new PowerOff();
mPerProcessState = new PerProcessState();
……
}
bluetooth adapter有六个状态,分别为:
1)BluetoothOn:就是打开的状态。
2)Switching:可以认为是正在打开的状态。
3)HotOff:这个状态可以理解为一个预热状态,他是在上电之后进行了一系列硬件初始化成功之后的状态,但是这种状态并不表现到ui上。但是从耗电的状态来看,他和2.3中bluetooth on是一样的。
4)WarmUp:可以理解为正在预热的状态,就是处于从断电到HotOff的状态。
5)PowerOff:就是掉电的状态,也就是正在的关闭状态,这个时候bluetooth是没有耗电(准确说是耗电很少)。
6)PerProcessState:他也是位于HotOff到BluetoothOn之间的一个状态,和Switching的差别在于Swtiching是我们通过ui上去打开的“正在打开”的状态,而perprocess则是应用于一些临时使用蓝牙的application,这些application并不需要完整的蓝牙功能(比如说在蓝牙打开后的自动连接等),也不需要ui上去显示蓝牙的打开。所以,有这样一个过渡的状态,在change到BluetoothOn的时候并不会发出类似state_on的broadcaset。当然,这个状态的使用场合并不是很多,大家了解一下就可以了。
各个状态之间的变化如下图所示。
从图中可以看出,这六个状态中有3个状态是bluetooth有可能长期处于的状态,也就是非中间状态,他们是BluetoothOn,HotOff以及PowerOff。还有3个状态是中间状态,分别是Switching,WarmUp以及PerProcessState。
从代码来看,在最开始会处于PowerOff的状态,如下:
BluetoothAdapterStateMachine(Context context, BluetoothService bluetoothService,
BluetoothAdapter bluetoothAdapter) {
……
setInitialState(mPowerOff); //初始化为PowerOff的状态
mPublicState = BluetoothAdapter.STATE_OFF;
}
因此,我们首先从PowerOff状态出发来分析:
private class PowerOff extends State {
@Override