實際開發過程中需要通過對藍牙狀态的監聽以滿足需求,這裡對藍牙狀态的改變進行了一次封裝。
這裡運用了動态廣播注冊,優點是注冊取消可以由代碼控制,在用到的地方注冊,用不到的地方及時取消,避免對手機資源的浪費。
廣播接收器BlueToothStateReceiver類
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* 廣播監聽藍牙狀态
*/
public class BlueToothStateReceiver extends BroadcastReceiver {
public static int DEFAULT_VALUE_BULUETOOTH = 1000;
public OnBlueToothStateListener onBlueToothStateListener;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, DEFAULT_VALUE_BULUETOOTH);
switch (state) {
case BluetoothAdapter.STATE_OFF://藍牙已關閉
onBlueToothStateListener.onStateOff();
break;
case BluetoothAdapter.STATE_ON://藍牙已開啟
onBlueToothStateListener.onStateOn();
break;
case BluetoothAdapter.STATE_TURNING_ON://藍牙正在打開
onBlueToothStateListener.onStateTurningOn();
break;
case BluetoothAdapter.STATE_TURNING_OFF://藍牙正在關閉
onBlueToothStateListener.onStateTurningOff();
break;
default:
Log.e("BlueToothError", "藍牙狀态未知");
}
}
}
public interface OnBlueToothStateListener {
void onStateOff();
void onStateOn();
void onStateTurningOn();
void onStateTurningOff();
}
public void setOnBlueToothStateListener(OnBlueToothStateListener onBlueToothStateListener) {
this.onBlueToothStateListener = onBlueToothStateListener;
}
}
接下來對調用工具類BlueToothUtils進行封裝,避免重複執行個體化,這裡使用單例模式。
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.IntentFilter;
/**
* @author wang songbo
*/
public class BlueToothUtils {
private static BlueToothUtils INSTANCE;
public static synchronized BlueToothUtils getInstance() {
if (INSTANCE == null) {
INSTANCE = new BlueToothUtils();
}
return INSTANCE;
}
BlueToothStateReceiver blueToothStateReceiver;
//注冊廣播接收器,用于監聽藍牙狀态變化
public void registerBlueToothStateReceiver(Activity activity) {
//注冊廣播,藍牙狀态監聽
blueToothStateReceiver = new BlueToothStateReceiver();
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
activity.registerReceiver(blueToothStateReceiver, filter);
blueToothStateReceiver.setOnBlueToothStateListener(new BlueToothStateReceiver.OnBlueToothStateListener() {
@Override
public void onStateOff() {
//do something
}
@Override
public void onStateOn() {
//do something
}
@Override
public void onStateTurningOn() {
//do something
}
@Override
public void onStateTurningOff() {
//do something
}
});
}
public void unregisterBlueToothStateReceiver(Activity activity) {
activity.unregisterReceiver(blueToothStateReceiver);
}
}
在Activity中注冊廣播接收器
BlueToothUtils.getInstance().registerBlueToothStateReceiver(this);
在Activity中取消廣播接收器注冊
BlueToothUtils.getInstance().unregisterBlueToothStateReceiver(this);
這個廣播接收器隻是擷取了藍牙狀态的變化,并不能判斷藍牙連接配接情況。将在下一篇寫出監聽藍牙連接配接狀态的廣播接收器封裝類。
注:AndroidMainfests.xml檔案中需加入藍牙權限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
藍牙連接配接狀态變化監聽傳送門:
https://blog.csdn.net/u010161303/article/details/88842804