Разница между close () и отключением () в Android Bluetooth API?

Android Bluetooth Low Energy API реализует 1 метод подключения к устройству connectGatt() но 2 метода для закрытия соединения disconnect() и close() .

Документация гласит:

Исходный код BluetoothGatt.java показывает, что close () отменяет регистрацию приложения и отключает () отключение клиента. Однако он не говорит, что это на самом деле означает. Я имею в виду, если есть только один способ подключения к клиенту, почему есть два способа закрыть / отключить соединение?

Solutions Collecting From Web of "Разница между close () и отключением () в Android Bluetooth API?"

С disconnect() вы можете позже вызвать connect() и продолжить этот цикл.

Как только вы назовете close() , все готово. Если вы хотите снова подключиться, вам снова нужно будет вызвать connectGatt() на BluetoothDevice ; close() освободит любые ресурсы, удерживаемые BluetoothGatt .

Вот пища для размышлений:

Пока вы не звоните близко к Gatt, вы все равно можете попытаться подключиться к нему или обнаружить. Поэтому, когда я пытаюсь обнаружить службы для машины, я обычно запускаю поток или runnable, который заставляет запрос подключаться к машине в течение определенного периода времени.

Первая попытка подключения к компьютеру вернет объект BluetoothGatt, который позже можно использовать для поиска служб для объекта BluetoothDevice. Кажется, довольно легко подключиться, но гораздо сложнее обнаружить аппаратные сервисы.

 mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback); 

Таким образом, в моем потоке / runnable, я проверю, имеет ли BluetoothGatt значение null. Если это так, я снова вызову вышеуказанную строку кода, иначе я попытаюсь обнаружить службы BluetoothGatt как таковые.

 mBluetoothGatt.discoverServices(); 

О, и я ВСЕГДА обязательно вызовите BluetoothAdapter.cancelDiscovery () перед любой попыткой подключения к обнаружению службы.

 mBluetoothAdapter.cancelDiscovery(); 

Вот метод, который используется для подключения в моем runnable и т. Д .:

 public void connectToMachineService(BLEMachine machine) { Log.i(SERVICE_NAME, "ATTEMPTING TO CONNECT TO machine.getDevice().getName()); mBluetoothAdapter.cancelDiscovery(); if(mBluetoothGatt == null) mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback); else mBluetoothGatt.discoverServices(); } 

Наконец, убедитесь, что вы закрыли любые объекты BluetoothGatt, к которым вы подключились. Похоже, что Android может обрабатывать пять объектов BluetoothGatt, прежде чем он начнет говорить «не удается подключиться к серверу Gatt» или что-то в этом роде.

На каждом BluetoothGatt, который я создаю, я позвоню на него, а затем передаст обновление с сообщением о закрытии соединения. Кажется, что много раз, когда BluetootGatt не будет реагировать с изменением состояния, когда он будет отключен. Мой метод закрытия BluetoothGatt выглядит примерно так. Я оставляю метод открытым для Activity, чтобы вызвать службу и отключиться, если машина становится неактивной и состояние разъединения не вызывается.

 public void disconnectGatt(BluetoothGatt gatt) { if(gatt != null) { gatt.close(); gatt = null; } broadcastUpdate(ACTION_STATE_CLOSED); }