当应用处于后台时,AltBeacon将完全停止扫描

移动开发 2026-07-09

重现步骤

  1. 打开应用
  2. 前往有信标的区域
  3. 等待发现
  4. 将应用置于后台
  5. 实际结果:

  6. 在logcat中找到 "We are inside a beacon region. We will not scan between cycles."

  7. 返回的在范围内的信标数组为空(有时什么也没有)
  8. 应用完全停止扫描。 看起来区域监控在工作,但我仍在测试阶段。
  9. 期望结果:我认为库应该进行省电的扫描。我是说调用

mScanHelper.startAndroidOBackgroundScan(mScanState.getBeaconParsers());

有没有任何理由认为这是有意为之,还是这是一个错误或未完成的代码。

ScanJob.java

private void startPassiveScanIfNeeded() {
    if (mScanState != null) {
        LogManager.d(TAG, "Checking to see if we need to start a passive scan");
        boolean insideAnyRegion = mScanState.getMonitoringStatus().insideAnyRegion();
        if (insideAnyRegion) {
            // TODO: Set up a scan filter for not detecting a beacon pattern
            LogManager.i(TAG, "We are inside a beacon region.  We will not scan between cycles.");
        }
        else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (mScanHelper != null) {
                    mScanHelper.startAndroidOBackgroundScan(mScanState.getBeaconParsers());
                }
            }
            else {
                LogManager.d(TAG, "This is not Android O.  No scanning between cycles when using ScanJob");
            }
        }
    }
}

解决方案

库在确认信标可见时会持续停止扫描以节省电量——周围有信标时持续开启扫描在功耗方面成本很高。库仍然会进行周期性扫描来查找信标,具体由backgroundScanPeriod / backgroundBetweenScanPeriod设置决定。按设计,你应该会看到扫描在每个后台扫描周期结束时定期重新启动:

  1. 你将收到该周期内检测到的所有信标的ranging回调。
  2. 如果在该周期内未发现任何信标,且regionExitPeriod毫秒内也未发现过信标,你将收到一个监测退出通知。
  3. 同样在情况2 下,库将启动后台扫描以继续寻找新出现的信标。(如果周围没有信标,这并不耗费额外资源。)

你展示的代码块是决定重新启动后台扫描的位置。为何它没有起作用,可能是你的测试用例有问题,或者你观察到的情况在某些方面与实际情况不完全一致。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章