区别并不在于回调本身,而在于它们被调用的方式和时间。
MonitoringListener.onEnteredRegion
并MonitoringListener.onExitedRegion
在您越过传递给 的区域的边界时触发BeaconManager.startMonitoring
。一旦您进入该区域onEnteredRegion
并被呼叫,您将不会收到另一个通知,除非您退出然后重新进入该区域。
相反,RangingListener.onBeaconsDiscovered
它被连续触发(默认情况下:每 1 秒)并为您提供 Android 设备发现的信标列表 - 只要它们与传递给BeaconManager.startRanging
.
例子:
想象一下,你有一个 UUID = X、major = Y 和 minor = Z 的信标。你定义你的区域如下:
Region region = new Region("myRegion", X, Y, Z)
然后开始测距和监控:
beaconManager.startRanging(region);
beaconMangeer.startMonitoring(region);
回调调用的时间线可能如下所示:
# assuming you start outside the range of the beacon
1s: onBeaconsDiscovered(<myRegion>, <empty list of beacons>)
2s: onBeaconsDiscovered(<myRegion>, <empty list of beacons>)
3s: onBeaconsDiscovered(<myRegion>, <empty list of beacons>)
# now you move closer to the beacon, ending up in its range
4s: *onEnteredRegion*(<myRegion>, <a list with the "X/Y/Z" beacon>)
+ onBeaconsDiscovered(<myRegion>, <a list with the "X/Y/Z" beacon>)
5s: onBeaconsDiscovered(<myRegion>, <a list with the "X/Y/Z" beacon>)
6s: onBeaconsDiscovered(<myRegion>, <a list with the "X/Y/Z" beacon>)
7s: onBeaconsDiscovered(<myRegion>, <a list with the "X/Y/Z" beacon>)
# now you move out of the beacon's range again
8s: *onExitedRegion*(<myRegion>)
+ onBeaconsDiscovered(<myRegion>, <empty list of beacons>)
9s: onBeaconsDiscovered(<myRegion>, <empty list of beacons>)
10s: onBeaconsDiscovered(<myRegion>, <empty list of beacons>)
请注意,实际上,蓝牙扫描的响应速度可能不如上面的示例。