天天看點

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就被無辜過濾掉了。