天天看点

Android蓝牙浅谈(过滤广播)

转载请声明出处: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这个状态呢?只判断开启状态就可以?

当蓝牙状态改变时,会发送蓝牙状态改变广播,我们定义的广播接收者就会接收到广播并判断广播状态。但由于蓝牙有四种的状态值,其中有两个是过程状态值,发生在两个结果状态值之前,所以我们的接收者会收到两次广播(以开启广播为例)。

  1. 蓝牙正在打开(STATE_TURNING_ON)
  2. 蓝牙已经打开(STATE_ON)

所以我们写的逻辑代码会被执行两次,如果不判断STATE_TURNING_ON状态,过滤值bluetoothFilter会在收到STATE_TURNING_ON状态的逻辑中变为true,下一个状态值STATE_ON就被无辜过滤掉了。