转载请声明出处:http://blog.csdn.net/green_pepper/article/details/69264927
很坑人的广播接收过程
上一篇博客提到了蓝牙的四种状态值
http://blog.csdn.net/green_pepper/article/details/68944872
- int STATE_OFF 蓝牙已经关闭
- int STATE_ON 蓝牙已经打开
- int STATE_TURNING_OFF 关闭蓝牙过程中
- int STATE_TURNING_ON 打开蓝牙过程中
这篇博客重点说一下第三个和第四个状态值(以第四个为例)
STATE_TURNING_ON:打开蓝牙过程中,指的是从打开蓝牙到蓝牙打开的前一刻,也就是说这段过程蓝牙并没有启动,不存在蓝牙已经打开的状态。
以下是广播的代码
class BluetoothReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//设置了一个boolean值控制过滤(true:过滤,false:不过滤)
if (bluetoothFilter) {
return;
}
bluetoothFilter = true;
if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR);
switch (state) {
//蓝牙正在开启(很重要的过程,坑)
case BluetoothAdapter.STATE_TURNING_ON:
//重要,重要,重要
bluetoothFilter = false;
break;
//蓝牙已经开启
case BluetoothAdapter.STATE_ON:
break;
default:
//用户拒绝打开蓝牙
break;
}
}
}
}
为什么要判断STATE_TURNING_ON这个状态呢?只判断开启状态就可以?
当蓝牙状态改变时,会发送蓝牙状态改变广播,我们定义的广播接收者就会接收到广播并判断广播状态。但由于蓝牙有四种的状态值,其中有两个是过程状态值,发生在两个结果状态值之前,所以我们的接收者会收到两次广播(以开启广播为例)。
- 蓝牙正在打开(STATE_TURNING_ON)
- 蓝牙已经打开(STATE_ON)
所以我们写的逻辑代码会被执行两次,如果不判断STATE_TURNING_ON状态,过滤值bluetoothFilter会在收到STATE_TURNING_ON状态的逻辑中变为true,下一个状态值STATE_ON就被无辜过滤掉了。