Ответ 1
Передача true для connectGatt() аргумент autoconnect запрашивает фоновое соединение, а при передаче ложных запросов - прямое соединение. BluetoothGatt # connect() всегда запрашивает фоновое соединение.
Фоновое соединение (в соответствии с источниками Bluedroid из 4.4.2 AOSP) имеет интервал сканирования 1280 мс и окно 11,25 мс. Это соответствует примерно 0,9% рабочего цикла, что объясняет, почему соединения, когда они не сканируются, могут занять много времени.
Прямое соединение имеет интервал 60 мс и окно 30 мс, поэтому соединения выполняются намного быстрее. Кроме того, за один раз может быть только один запрос на прямой запрос, и он истекает через 30 секунд. onConnectionStateChange() вызывается с состоянием = 2, статус = 133, чтобы указать этот таймаут.
Я проверил это поведение на Nexus5, но, очевидно, YMMV.
Я должен упомянуть, что в BluetoothGatt.java есть условие гонки, которое может вызвать прямой запрос соединения, даже если autoconnect = true передается в BluetoothDevice # connectGatt().