即使设备处于深度睡眠状态,我也希望我的Android应用执行定期LE扫描。为此,我使用Alarm Manager
启动执行扫描的IntentService
。
由于startLEScan()仅通知BLE设备一次,并且我想在近BLE设备上获得持续报告,我需要停止并启动LE扫描。这是我的IntentService
代码:
@Override
protected void onHandleIntent(Intent intent) {
_bluetoothAdapter.stopLeScan(this); //I get it using BluetoothAdapter.getDefaultAdapter()
try {
Thread.sleep(2000); //I wait between a stop and a start
} catch (InterruptedException e) {
Log.e(TAG, "Thread sleep interrupted!",e);
}
if (!_bluetoothAdapter.startLeScan(this)) {
Log.e(TAG, "Failed to scan");
} else {
Log.d(TAG,"scan started");
}
}
当我运行这段代码时,我看到调用了startLEScan()和stopLEScan(),但是忽略了stopLEScan(),因为我希望在扫描中找到的BLE设备只能找到一次,之后IntentService
的几次激活(Alarm Manager
每4000毫秒触发一次),我看到"无法扫描"错误,好像我只是在没有停止扫描的情况下发送了startLEScan()请求。
在您看来,我错过了什么?
答案 0 :(得分:0)
我认为你正在犯严重的错误:
使用IntentService
作为后台扫描的工具,而不是“常规”Service
IntentService.onHandleIntent()已在工作线程上执行,并且在执行后 - 除非它在队列中有更多“等待处理”的意图 - 它将自动停止。
意味着什么 - 在IntentService
已经被销毁之后才会执行扫描回调(如果有的话)!!!
你可能有“副作用”这个由...造成的错误..
与IntentService
相反 - 当Service
完成执行时,常规onStartCommand()
不会停止。只有当你明确地调用stopSelf()时,或者系统将面临释放内存的极大压力时,它才会响起来。