Я создал BroadcastReceiver для BluetoothDevice.ACTION_FOUND в службе для сканирования и регистрации доступных устройств Bluetooth.Часть этой услуги заключается в том, чтобы каждые 30 секунд проверять, доступно ли какое-либо из ранее обнаруженных устройств Bluetooth или нет.В настоящее время он выдает ошибку для Leaked IntendReceiver, я могу исправить эту ошибку, однако я просто не уверен, что это правильный способ сделать это.Я создаю новый поток для обработки сканирования по Bluetooth, создаю цикл while, который выполняется каждые 30 секунд, и внутри этого цикла регистрация BroadcastReceiver, перевод потока в спящий режим, к тому времени, когда время ожидания закончится, onReceive дает мне результаты текущего сканирования,затем я отменяю регистрацию BroadcastReceiver и повторяю цикл.
Я отменяю регистрацию BroadcastReceiver после каждого завершения цикла while, потому что при следующем сканировании я получаю список доступных на данный момент устройств, а затем сравниваю это с данными предыдущего сканирования.
Это удовлетворяет моему требованиюОднако у меня есть сильное чувство, что это не правильный дизайн.Не могли бы вы посоветовать мне альтернативный подход?Спасибо ..
Ниже приведен соответствующий код из Службы -
class ScanBT extends Thread
{
static final long DELAYBT = 30000;
@Override
public void run()
{
isBTRunning = true;
Looper.prepare();
BluetoothAdapter mBluetoothAdapter =BluetoothAdapter.getDefaultAdapter();
try {
Log.d(TAG, "BT Scanning started");
while(isBTRunning)
{
if (!mBluetoothAdapter.isEnabled())
{
mBluetoothAdapter.enable();
Thread.sleep(15000);
}
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
mBluetoothAdapter.startDiscovery();
Log.d(TAG,"Inside while loop for BT");
Thread.sleep(DELAYBT);
unregisterReceiver(mReceiver);
}
Looper.loop();
}
catch (InterruptedException e) {
Log.d(TAG, "BT Scanning stopped");
Looper.myLooper().quit();
}
}
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
BTDevice = device.getName();
BTAddress = device.getAddress();
Log.d(TAG,"BT Found name: " + BTDevice);
Log.d(TAG,"BT Found address: " + BTAddress);
//Code to compare with previous scan results
}
}
};