我在服务中为BluetoothDevice.ACTION_FOUND创建了一个BroadcastReceiver来扫描和记录可用的蓝牙设备。如果任何以前找到的蓝牙设备仍然可用,则该服务的一部分是每30秒继续检查一次。目前它为Leaking IntendReceiver抛出了一个错误,我可以解决这个错误,但是我不相信这是正确的方法。 我正在创建一个处理蓝牙扫描的新线程,创建一个每30秒运行一次的while循环,并在该循环中注册BroadcastReceiver,将线程置于睡眠状态,当睡眠时间超过onReceive时,我会得到当前扫描的结果,然后我取消注册BroadcastReceiver并重复循环。
我在每次完成while循环后取消注册BroadcastReceiver,因为下一次扫描会给出当前可用设备的列表,然后我将其与之前的扫描数据进行比较。
它满足了我的要求,但我有一种强烈的感觉,它不是正确的设计。你能否就另一种方法向我提出建议?感谢..
以下是服务的相关代码 -
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
}
}
};
答案 0 :(得分:1)
想出来。没有其他方法可以实现这一目标。为了控制性能,我现在只注册接收器一次,然后在60秒的睡眠间隔内循环开始发现。