蓝牙后台连接
- 前台蓝牙服务和后台蓝牙服务—
bindService和startService的区别
startService只是简单启动服务,启用之后便无法控制,只能调用stopService停止。
bindService使活动和服务进行通信。
复写Service类中的onBinder()方法,返回要控制的binder对象。新建ServiceConnection,在其中拿到binder对象。然后进行操作,实现service和activity的通信。
使用bindService进行绑定(intent connection auto)
使用unbindService进行解绑(connection)
后台保持连接:在unbind之后立即startService(),同时使用一个常量记录当前连接状态。
当再进入这个界面时,需要进行判断,如果已连接,则不断开,未连接则连接。
在程序退出时,进行断开蓝牙连接服务。
扫描蓝牙设备
- 首先获取到BluetoothManager 通过其中的getAdapter()方法拿————————————到—————————————————————-BluetoothAdapter,然后通过BluetoothAdapter的startScan(LeScanCallback)的方法开始扫描设备。
- onLeScan(BluetoothDevice)就是我们扫描的设备。
- 使用BluetoothDevice.connectGatt()的方法进行连接,返回BluetoothGatt的实例,就可以进行相关读写数据操作了。
GATT
GATT(Generic Attribute Profile,普通属性协议),它使BLE设备通过Service和Characteristic进行通信。
代码实现蓝牙连接流程
- 初始化蓝牙相关信息
首先判断是否支持蓝牙4.0BLE,需要安卓系统4.3以上才可以。
final BluetoothManager bluetoothManager =
(BluetoothManager) atyFrameworkActivity.getSystemService(Context.BLUETOOTH_SERVICE);
//获取到蓝牙管理器
mBluetoothAdapter = bluetoothManager.getAdapter();
//通过蓝牙管理器获取到蓝牙适配器
- 通过bindService后获取到蓝牙服务,进行蓝牙搜索。在serviceConnection中开启蓝牙搜索
mBluetoothAdapter.startLeScan(mLeScanCallback);
//通过startLeScan进行搜索,实现蓝牙回调函数
在回调函数中,记录下搜索到的蓝牙地址
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
atyFrameworkActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run()");
bluetoothDeviceAddressSet.add(device.getAddress());
bluetoothDevicesset.add(device);
3.