在后台定期调用时,将忽略stopLeScan

时间:2014-05-04 13:22:25

标签: android bluetooth-lowenergy

即使设备处于深度睡眠状态,我也希望我的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()请求。

在您看来,我错过了什么?

1 个答案:

答案 0 :(得分:0)

我认为你正在犯严重的错误:

使用IntentService作为后台扫描的工具,而不是“常规”Service

IntentService.onHandleIntent()已在工作线程上执行,并且在执行后 - 除非它在队列中有更多“等待处理”的意图 - 它将自动停止。

意味着什么 - 在IntentService已经被销毁之后才会执行扫描回调(如果有的话)!!!

你可能有“副作用”这个由...造成的错误..

IntentService相反 - 当Service完成执行时,常规onStartCommand()不会停止。只有当你明确地调用stopSelf()时,或者系统将面临释放内存的极大压力时,它才会响起来。