我目前正在编写一个使用 AltBeacon(以前是 Radius Network)的 Android-Beacon-Library 的 android 应用程序。
我要求应用程序在看到信标时显示通知,这是我使用引导通知程序实现的,如在后台启动应用程序标题下的示例代码中详述。(修改此代码以显示通知,而不是启动应用程序)。
但是,我还需要该应用程序在另一个活动中设置 RangeNotifier,以便我可以测量信标与移动设备的距离。我还通过修改上面链接中的示例代码来做到这一点,位于测距示例代码标题下。
然而,当我这样做时,绑定到活动并设置 RangingNotifier 似乎很好,但是在销毁活动时,它似乎并没有取消绑定活动实现的 BeaconConsumer 并且didRangeBeaconsInRegion(...)
函数内的代码继续执行,即使 onDestroy( ) 被调用。
所以我在调用beaconManager.stopRangingBeaconsInRegion(region);
之前尝试调用beaconManager.unbind(this);
,这似乎阻止了其中的代码didRangeBeaconsInRegion(...)
执行,但是在活动被破坏后,我仍然在日志中看到蓝牙 LE 反复扫描,每次扫描之间没有延迟。
08-14 11:09:50.527: D/BluetoothAdapter(21572): stopLeScan()
08-14 11:09:50.537: D/BluetoothAdapter(21572): startLeScan(): null
08-14 11:09:50.547: D/BluetoothAdapter(21572): onClientRegistered() - status=0 clientIf=7
通常,当我使用 RangingNotifier 上传新构建并返回特定活动时,我会收到以下错误:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at org.altbeacon.beacon.service.BeaconService$ScanProcessor.doInBackground(BeaconService.java:609)
at org.altbeacon.beacon.service.BeaconService$ScanProcessor.doInBackground(BeaconService.java:602)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4 more
这让我相信 BeaconManager 可能不会从 Activity 中解除绑定。
是否可以通过使用应用程序类同时使用后台监控,并在同一应用程序的活动中使用 RangingNotifier?
抱歉,这个问题很长,似乎在其他地方找不到任何详细说明!