轉載請聲明出處: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就被無辜過濾掉了。