我在使用XmlReader
时遇到扫描周期问题。这是我的问题:
我有三个主要课程:android-beacon-library
,MainActivity
和BaseService
。
BeaconService
:只需执行MainActivity
和startForeground
操作。stopForeground
:执行一些参数初始化,BaseService
等等。BeaconManager
:信标操作。我首先描述我的问题。我正在使用前台服务进行扫描操作,backgroundScanPeriod是20l。我还有一个带有两个按钮的MainActivity,startService和stopService。首次打开应用程序并单击startService时,扫描周期为10秒。
然后我点击HOME并终止此应用程序服务正常运行,扫描周期也是10秒。但是当我通过点击图片上的通知重新打开BeaconService
时。
扫描周期将变为1秒。这对我来说很快。但是如果我再次单击HOME,扫描周期将变为正常。这意味着,除了第一次打开MainActivity之外,扫描周期每次都会变得非常快。
我想知道为什么。以下是我的重要代码:
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
希望你们能帮助我。提前谢谢。
答案 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);