我目前正在编写一个android应用程序,利用AltBeacon的(以前是Radius Network的)android - beacon - library。
我要求应用程序在看到信标时显示通知,这是我在在后台头中使用Bootstrap通知器实现的示例代码中详细说明的。(修改此代码以显示通知,而不是启动应用程序)。
然而,我也要求应用程序在另一个活动中设置一个RangeNotifier,这样我就可以测量信标与移动设备的距离。我还通过修改上面链接中范围示例代码头下的示例代码来做到这一点。
当我这样做的时候,绑定到活动并设置RangingNotifier似乎很好,但是在销毁活动时,它似乎没有解除由活动实现的BeaconConsumer的绑定,并且didRangeBeaconsInRegion(...)
函数内的代码即使onDestroy()被调用也继续执行。
所以我在调用beaconManager.unbind(this);
之前尝试调用beaconManager.stopRangingBeaconsInRegion(region);
,这似乎阻止了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
通常当我上传一个新的构建并使用rangingnotification返回到特定的活动时,我会收到以下错误:
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 ?
很抱歉这么长的问题,似乎在其他地方找不到任何详细的内容!
如果我是你,我会把所有与信标相关的东西放在你的应用程序类中,然后使用LocalBroadcastManager让你的应用程序的其他部分知道范围:假设RANGING_DONE是一个公共静态final字符串RANGING_DONE = "RANGING_DONE";
Intent rangingDoneIntent = new Intent(YourAppClass.RANGING_DONE);
LocalBroadcastManager.getInstance(this).sendBroadcast(
rangingDoneIntent);
你甚至可以在Intent中添加信标,因为它们实现了Parcelable。
然后在你的活动中,监听RANGING_DONE的意图:
LocalBroadcastManager.getInstance(this).registerReceiver(mRangingDoneReciever, new IntentFilter(YourAppClass.RANGING_DONE));
其中mRangingDoneReciever是broadcastreceiver:
private BroadcastReceiver mRangingDoneReciever = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Do something with the recieved ranging....
}
}
我希望我能用我的答案…
史蒂芬/