我目前正在编写一款利用AltBeacon(以前的Radius Network)Android-Beacon-Library的Android应用程序。
我要求应用程序在看到信标时显示通知,我已使用Bootstrap通知程序实现,详见示例代码here中的在后台启动应用程序头。 (修改此代码以显示通知而不是启动应用程序。)
但是我还要求应用程序在另一个活动中设置RangeNotifier,这样我就可以测量信标与移动设备的距离。我还通过修改上面链接中测距示例代码标题下的示例代码来完成此操作。
当我这样做时,它似乎很好地绑定到活动并设置RangingNotifier,但是在销毁活动时它似乎没有取消绑定活动实现的BeaconConsumer和{{1}中的代码即使正在调用onDestroy(),函数也会继续执行。
所以我在调用didRangeBeaconsInRegion(...)
之前尝试调用beaconManager.stopRangingBeaconsInRegion(region);
,这似乎阻止beaconManager.unbind(this);
内的代码执行,但在活动被销毁后我仍然看到蓝牙LE扫描反复在日志中每次扫描之间没有延迟。
didRangeBeaconsInRegion(...)
通常当我上传新版本并使用RangingNotifier返回特定活动时,我会收到以下错误:
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
这让我相信BeaconManager可能没有从Activity中解除绑定。
是否可以通过使用Application Class同时使用Background Monitoring,并在同一应用程序中的活动中使用RangingNotifier?
很抱歉这个长期的问题,似乎无法在其他地方找到任何详细说明!
答案 0 :(得分:0)
如果我是你,我会在你的Application类中拥有所有与beacon相关的东西,然后使用LocalBroadcastManager让app的其他部分知道范围: 假设RANGING_DONE是公共静态最终字符串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是BroadcastReciever:
private BroadcastReceiver mRangingDoneReciever = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Do something with the recieved ranging....
}
}
我希望我能用我的答案......
/斯特芬