我有一个包含BluetoothGattCallback实例的服务

public class MyService extends Service {

    private BluetoothGattCallback callback;

    @Override
    public void onCreate() {
            super.onCreate();

            callback = new BluetoothGattCallback() {
                      @Override
                      public synchronized void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
                              Log.i("onConnectionStateChanged", "Status " + status);
                              Log.i("onConnectionStateChanged", "New State " + newState);
                      }
            };
    }

    // registration of bluetooth adapter and blah blah blah


}

当我启动该应用程序时,它可以正常工作,并且回调仅被调用一次,但是经过几次尝试后,它却被调用了两次。

样本日志
10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: Status 0
10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: New State 2
10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: Status 0
10-22 13:29:18.731 26944-26961/redacted.lollipop I/onConnectionStateChange: New State 2

更多样本日志
10-22 13:29:48.836 26944-26961/redacted.lollipop I/onConnectionStateChange: Status 8
10-22 13:29:48.836 26944-26961/redacted.lollipop I/onConnectionStateChange: New State 0
10-22 13:29:48.850 26944-30763/redacted.lollipop I/onConnectionStateChange: Status 8
10-22 13:29:48.850 26944-30763/redacted.lollipop I/onConnectionStateChange: New State 0

应用程序保持 Activity 状态的时间越长,它被调用的次数就越多。我该如何预防?

最佳答案

要记住的一件事是,每次致电

bluetoothDevice.connectGatt(context, true, callback);

它创建了bluetoothGatt对象的新实例。 check out the source for this one您将看到:
         BluetoothGatt gatt = new BluetoothGatt(context, iGatt, this, transport);
         gatt.connect(autoConnect, callback);

因此,一件棘手的事情是,如果您的设备断开连接,然后您重新连接到该设备。 connectGatt(上下文,true,回调);而不是在之前的bluetoothGatt实例上调用connect(),您将获得2个都具有gatt回调句柄的bluetoothGatt实例。

最初,我试图通过尝试在重新连接之前关闭并断开bluetoothGatt的方法来解决此问题。
   if (service.bluetoothGatt!=null){
        Log.i("Rides","Closeing bluetooth gatt on disconnect");
        service.bluetoothGatt.close();
        service.bluetoothGatt.disconnect();
        service.bluetoothGatt=null;
    }

但这不能很好地工作,以某种方式我将获得多个onConnectionStateChanged回调。

通过检查我是否具有有效的bluetoothGatt对象,并确保在其重新连接时确保对其调用connect(),便能够解决此问题。

----更新后的答案----

我发现最好在onConnectionStateChanged回调中调用bluetoothGatt.close()。当您发出断开连接时,它会向蓝牙设备发送一条消息,要求断开连接。然后,一旦响应,您将获得回调并关闭蓝牙gatt连接。通过等待回调并在完全关闭之前不打开另一个gatt连接,似乎可以防止多个gatt对象连接到应用程序。

09-10 06:27