Estimote beacon - 监听和测距听众之间的差异

Mat*_*teo 8 android estimote

我似乎并不真正理解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) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

我并没有真正理解onBeaconsDiscovered和onEnteredRegion方法之间的区别.当你开始收听其中任何一个时,你都会将Region作为参数传递给我,这让我更加困惑,因为乍一看我假设第一个只是不断搜索而另一个只是寻找一个特定的区域.

谢谢!

小智 17

差异不在于回调本身,而在于如何以及何时被调用.

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)
Run Code Online (Sandbox Code Playgroud)

然后启动测距和监控:

beaconManager.startRanging(region);
beaconMangeer.startMonitoring(region);
Run Code Online (Sandbox Code Playgroud)

回调调用的时间轴可能如下所示:

# 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>)
Run Code Online (Sandbox Code Playgroud)

请注意,实际上,蓝牙扫描可能不像上面的示例那样响应.