我似乎并不真正理解MonitoringListener和RangingListener之间的区别。
在我的特定用例中,我希望不断了解范围内的所有信标,并想知道何时退出与其相关的区域。
这是我所谈论的片段:
beaconManager.setRangingListener(new BeaconManager.RangingListener() {
@Override
public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {
}
});
beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
@Override
public void onEnteredRegion(Region region, List<Beacon> beacons) {
}
@Override
public void onExitedRegion(Region region) {
}
});
我并没有真正理解onBeaconsDiscovered和onEnteredRegion方法之间的区别。当你开始收听其中任何一个时,你都会将Region作为参数传递给我,这让我更加困惑,因为乍一看我假设第一个只是不断搜索而另一个只是寻找一个特定的区域。
谢谢!
答案 0 :(得分:17)
差异不在于回调本身,而在于如何以及何时被调用。
当你越过传递给MonitoringListener.onEnteredRegion
的区域的边界时,会触发{p> MonitoringListener.onExitedRegion
和BeaconManager.startMonitoring
。进入该区域并调用onEnteredRegion
后,除非您退出然后重新进入该区域,否则您将不会收到其他通知。
相反,RangingListener.onBeaconsDiscovered
会被持续触发(默认情况下:每1秒),并为您提供Android设备发现的信标列表 - 只要它们与传递给{{1}的区域相匹配}。
想象一下,您有一个UUID = X,major = Y和minor = Z的信标。您可以按如下方式定义您的区域:
BeaconManager.startRanging
然后开始测距和监控:
Region region = new Region("myRegion", X, Y, Z)
回调调用的时间轴可能如下所示:
beaconManager.startRanging(region);
beaconMangeer.startMonitoring(region);
请注意,实际上,蓝牙扫描可能不像上面的示例那样响应。