Estimote beacons — разница между прослушивателями мониторинга и ранжирования

Кажется, я не очень понимаю разницу между 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. Когда вы начинаете слушать любой из них, вы передаете регион в качестве параметра, так что это меня немного больше смущает, так как на первый взгляд я предположил, что первый просто постоянно искал, а другой просто искал определенный регион.

Спасибо!


person Mateo    schedule 30.08.2014    source источник


Ответы (1)


Разница не в самих обратных вызовах, а в том, как и когда они вызываются.

MonitoringListener.onEnteredRegion и MonitoringListener.onExitedRegion срабатывают всякий раз, когда вы пересекаете границу области, переданной BeaconManager.startMonitoring. После того, как вы войдете в регион и будет вызван onEnteredRegion, вы не получите другого уведомления, пока не выйдете из региона, а затем снова не войдете в него.

Напротив, RangingListener.onBeaconsDiscovered срабатывает постоянно (по умолчанию: каждую секунду) и предоставляет вам список маяков, обнаруженных вашим устройством Android, если они соответствуют региону, переданному BeaconManager.startRanging.

Пример:

Представьте, что у вас есть маяк с UUID = X, основным = Y и второстепенным = 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>)

Обратите внимание, что в действительности сканирование Bluetooth может быть не таким быстрым, как в приведенном выше примере.

person heypiotr    schedule 02.09.2014