当前位置: 首页 > 知识库问答 >
问题:

为什么didRangeBeaconsInRegion多次调用?

东方嘉木
2023-03-14
public class BeaconMonitoringService extends Service implements BootstrapNotifier, BeaconConsumer, RangeNotifier {



private static final String TAG = "BeaconMonitoringService";



private BeaconManager beaconManager;



@SuppressWarnings("unused")

private RegionBootstrap regionBootstrap;

@SuppressWarnings("unused")

private BackgroundPowerSaver backgroundPowerSaver;

private Region region;



@Override

public void onCreate() {

    super.onCreate();

    beaconSession = new BeaconSession(this);

    beaconManager = BeaconManager.getInstanceForApplication(this);

    beaconManager.getBeaconParsers().clear();



    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

    region = new Region("MyBeacon", Identifier.parse("0800200C9A66"), null, null);

    regionBootstrap = new RegionBootstrap(this, region);

    beaconManager.setBackgroundMode(true);

    backgroundPowerSaver = new BackgroundPowerSaver(this);

    beaconManager.bind(this);

}



@Override

public void didEnterRegion(Region region) {

    try {

        Log.d(TAG, "Did Enter Region.");

        beaconManager.startRangingBeaconsInRegion(region);

    } catch (RemoteException e) {

        if (BuildConfig.DEBUG) Log.d(TAG, "Can't start ranging");

    }

}



@Override

public void didExitRegion(Region region) {

    try {

        Log.d(TAG, "Did Exit Region");

    } catch (RemoteException e) {

        if (BuildConfig.DEBUG) Log.d(TAG, "Can't start ranging");

    }

}



@Override

public void didDetermineStateForRegion(int state, Region region) {

    switch (state) {

        case MonitorNotifier.INSIDE:

            Log.d(TAG, "INSIDE");

            didEnterInRegion = true;

            break;

        case MonitorNotifier.OUTSIDE:

            Log.d(TAG, "OUTSIDE");

            didEnterInRegion = false;

            break;

        default:

            didEnterInRegion = false;

            Log.d(TAG, "state" + state);

            break;

    }



}



@Override

public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

    if (beacons.size() > 0) {

            for (Beacon beacon : beacons) {



             if (beacon.getId1().equals(Identifier.parse("0800200C9A66")) && beacon.getDistance() < 1.0) {

                         sendNotification(beacon);

                    }

            }

    }

}



@Override

public void onBeaconServiceConnect() {

    beaconManager.addRangeNotifier(this);

    try {

        beaconManager.startRangingBeaconsInRegion(region);

    } catch (RemoteException e) {

    }

}



@Override

public IBinder onBind(Intent intent) {

    return null;

}



@Override

public void onDestroy() {

    beaconManager.unbind(this);

    super.onDestroy();

}

共有1个答案

韩志专
2023-03-14

didrangeBeaconsinRegion被设计为在每个扫描周期结束时(默认为每1秒)定时触发,以告诉您在此期间看到了哪些信标。

如果只希望在检测到每个信标之前触发一次事件,可以创建一个类变量来保存一个标志,指示是否已经处理了每个信标。

像这样:

// Put this at your class level
Set<String> mBeaconsProcessed = new HashSet<>();

...

// Put this code inside your didRangeBeaconsInRegion method

// Only process this beacon if we have not done so before
if (!mBeaconsProcessed.contains(beacon.toString)) {
    if (beacon.getId1().equals(Identifier.parse("0800200C9A66")) && beacon.getDistance() < 1.0) {
         sendNotification(beacon);
         // Mark this beacon as having already been processed.
         mBeaconsProcessed.put(beacon.toString));
         }
    }
}
 类似资料:
  • 问题内容: 我正在使用Swift开发iOS通用应用程序,使用自动布局功能,并且仅支持纵向模式。 我发现打过多次。而是在启动MyApp时仅被调用一次。 为什么要多次调用?是否会按顺序对每个(,等)进行约束? 任何信息将不胜感激。 问题答案: 仅被调用一次:需要加载视图时。 ,但是,每个运行循环都会在已存在或已对其调用的任何视图上调用一次- 这包括每当将子视图添加到视图,滚动,调整大小等时。

  • 第3次didRangeBeaconsInRegion()方法在2秒内调用3次 诸如此类.... 代码段

  • 问题内容: 关于的简单代码。是SessionScoped Bean,是RequestScoped Bean 内 我的问题是被叫很多。会告诉我们该方法在什么阶段被调用。首次加载页面时,请在阶段6-进行约 5次 呼叫。该页面上有一个,因此我在其中键入一些内容,然后单击(命令按钮)。然后在阶段1-> 4期间再呼叫 12次 。每个阶段调用此方法 3-4次 。然后,此属性的get 方法的setter方法(即

  • 我读在初始渲染时只被调用一次,但我看到它被渲染了多次。 似乎我创建了一个递归循环。 组件didMount调度动作来获取数据 一旦接收到数据,它就会触发成功操作,将数据存储在redux状态。 父反应组件连接到redux存储,并且具有mapStateToProps用于刚刚在上述步骤中更改的条目 父渲染子组件(通过变量编程选择) 子组件的组件didMount再次被调用 它消除了获取数据的操作 我想这就是

  • 问题内容: 这些天,我正在学习JSF + Facelets。我有一个BackingBean和Facelet xHTML页面。当我请求facelet页时(仅一次),backing-bean-method被多次调用。 这可能是什么原因? 我看不到什么特别的东西。提前致谢。 这是方面: 这是支持豆。方法getKunden被多次调用: 问题答案: Bean的getter在那里就 可以 从视图侧 访问 模型

  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那