关于android-beacon-library的扫描周期的问题

时间:2016-03-08 14:38:01

标签: ibeacon android-bluetooth ibeacon-android altbeacon beacon

我在使用XmlReader时遇到扫描周期问题。这是我的问题:

我有三个主要课程:android-beacon-libraryMainActivityBaseService

  • BeaconService:只需执行MainActivitystartForeground操作。
  • stopForeground:执行一些参数初始化,BaseService等等。
  • BeaconManager:信标操作。

我首先描述我的问题。我正在使用前台服务进行扫描操作,backgroundScanPeriod是20l。我还有一个带有两个按钮的MainActivity,startService和stopService。首次打开应用程序并单击startService时,扫描周期为10秒。 10s-scan-period

然后我点击HOME并终止此应用程序服务正常运行,扫描周期也是10秒。但是当我通过点击图片上的通知重新打开BeaconService时。

扫描周期将变为1秒。这对我来说很快。但是如果我再次单击HOME,扫描周期将变为正常。这意味着,除了第一次打开MainActivity之外,扫描周期每次都会变得非常快。

1s

我想知道为什么。以下是我的重要代码:

MainActivity

MainActivity.class

@OnClick(R.id.start_service) void start_Service() { if (Utils.isServiceRunning(MainActivity.this, Constants.CLASSNAME)) { Toast.makeText(this, "service is running, don't start again", Toast.LENGTH_SHORT).show(); } else { Intent intent = new Intent(MainActivity.this, BeaconService.class); intent.setAction(Constants.ACTION.STARTFOREGROUND_ACTION); startService(intent); setInfo(); } } @OnClick(R.id.stop_service) void stop_Service() { if (Utils.isServiceRunning(MainActivity.this, Constants.CLASSNAME)) { Intent intent = new Intent(MainActivity.this, BeaconService.class); intent.setAction(Constants.ACTION.STOPFOREGROUND_ACTION); startService(intent); setInfo(); } else { Toast.makeText(this, "service is dead, don't kill again", Toast.LENGTH_SHORT).show(); } }

BaseService.class

private void setBeaconManager() { beaconManager.setBackgroundBetweenScanPeriod(20l); beaconManager.setBackgroundMode(true); beaconManager.getBeaconParsers().clear(); beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(Constants.BEACON_LAYOUT.COMMON_LAYOUT)); }

BeaconService.class

希望你们能帮助我。提前谢谢。

1 个答案:

答案 0 :(得分:1)

几点:

  • 使用Android Beacon Library,前景和背景,扫描周期有两组不同的设置。当使用代码中显示的BackgroundPowerSaver时,Android Beacon Library会自动在前台扫描周期和后台扫描周期之间来回切换。

  • 使用BackgroundPowerSaver时,手动设置beaconManager.setBackgroundMode(true)只会在下次应用程序循环到前台时生效 - BackgroundPowerSaver将更改值自动设置。

  • 扫描周期的单位是毫秒。因此,设置beaconManager.setBackgroundBetweenScanPeriod(20l);会将扫描周期设置为20毫秒。这太短了,无法可靠地接收信标。我建议最短扫描周期为1100毫秒。周期越长,检测到信标的概率越高,但使用的电池越多。

  • 如果您想在两次扫描之间等待10秒,则需要设置:beaconManager.setBackgroundBetweenScanPeriod(10000l); // 10000 ms = 10.0 secs

如果您希望在前景和背景中应用相同的扫描周期,只需将它们设置为相同:

 beaconManager.setBackgroundBetweenScanPeriod(10000l);
 beaconManager.setForegroundBetweenScanPeriod(10000l);
 beaconManager.setBackgroundScanPeriod(1100l);
 beaconManager.setForegroundScanPeriod(1100l);