如何运行 AltBeacon库前台服务正常
How to run AltBeacon libraries foreground service properly
所以,我正在使用 AltBeacon 库,我从日志文件中发现,有时无法检测到信标。所有问题都出现在 Android 8.0 的设备上,所以我自动认为这是因为 beaconManager 是 运行 作为后台服务。好吧,我把应用程序带到后台,等了 15 分钟,然后启动它,服务按预期工作(信标检测)。但是,实现很奇怪。
我所做的是,我 Service A
在前景 运行:
Intent serviceA = new Intent(this, ServiceA.class);
ContextCompat.startForegroundService(this, serviceA);
因此,lateron Service A
调用 BManager
启动信标管理器,如下所示:
beaconManager = BeaconManager.getInstanceForApplication(mContext);
beaconManager.getBeaconParsers().clear();
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("..."));
beaconManager.setForegroundScanPeriod(3000);
beaconManager.setBackgroundBetweenScanPeriod(3000);
BeaconManager.setRegionExitPeriod(11000L);
backgroundPowerSaver = new BackgroundPowerSaver(mContext);
beaconManager.bind(this);
我不确定仅仅因为 Service A
在前台 运行 是否也是信标管理器?我确实设置了 setForegroundScanPeriod
,但我没有调用 enableForegroundServiceScanning
这有多重要?有什么方法可以查看 beaconManager 是在后台还是前台(服务)运行?我应该如何更改我的代码以确保扫描在前台进行(我需要什么额外的代码)?也许我应该将我的 BManager
从 Service A
拆分为其他替代方案(提示和原因说明为什么这种方法会更好)。
我会尽可能生成日志文件,但截至目前,从代码的角度来看,也许还有一些事情要做(也许很容易看出实现中出现了很大的问题)。
问题中显示的代码将无法 使库作为前台服务进行扫描。仅仅因为您制作了自己的前台服务,并不意味着图书馆使用它来安排扫描。
默认情况下,在 Android 8+ 上,图书馆使用作业调度程序 运行 在后台每 15 分钟扫描一次。前台服务替代方案要求启用图书馆自己的扫描服务并将其配置为前台服务。这确实需要调用 enableForegroundServiceScanning
,但设置它还不止于此。
图书馆的documentation has a page for how to configure it as a foreground service here. You can also see an example of this in the library's Reference Application.
我建议您只需复制该设置代码即可使其正常工作。
所以,我正在使用 AltBeacon 库,我从日志文件中发现,有时无法检测到信标。所有问题都出现在 Android 8.0 的设备上,所以我自动认为这是因为 beaconManager 是 运行 作为后台服务。好吧,我把应用程序带到后台,等了 15 分钟,然后启动它,服务按预期工作(信标检测)。但是,实现很奇怪。
我所做的是,我 Service A
在前景 运行:
Intent serviceA = new Intent(this, ServiceA.class);
ContextCompat.startForegroundService(this, serviceA);
因此,lateron Service A
调用 BManager
启动信标管理器,如下所示:
beaconManager = BeaconManager.getInstanceForApplication(mContext);
beaconManager.getBeaconParsers().clear();
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("..."));
beaconManager.setForegroundScanPeriod(3000);
beaconManager.setBackgroundBetweenScanPeriod(3000);
BeaconManager.setRegionExitPeriod(11000L);
backgroundPowerSaver = new BackgroundPowerSaver(mContext);
beaconManager.bind(this);
我不确定仅仅因为 Service A
在前台 运行 是否也是信标管理器?我确实设置了 setForegroundScanPeriod
,但我没有调用 enableForegroundServiceScanning
这有多重要?有什么方法可以查看 beaconManager 是在后台还是前台(服务)运行?我应该如何更改我的代码以确保扫描在前台进行(我需要什么额外的代码)?也许我应该将我的 BManager
从 Service A
拆分为其他替代方案(提示和原因说明为什么这种方法会更好)。
我会尽可能生成日志文件,但截至目前,从代码的角度来看,也许还有一些事情要做(也许很容易看出实现中出现了很大的问题)。
问题中显示的代码将无法 使库作为前台服务进行扫描。仅仅因为您制作了自己的前台服务,并不意味着图书馆使用它来安排扫描。
默认情况下,在 Android 8+ 上,图书馆使用作业调度程序 运行 在后台每 15 分钟扫描一次。前台服务替代方案要求启用图书馆自己的扫描服务并将其配置为前台服务。这确实需要调用 enableForegroundServiceScanning
,但设置它还不止于此。
图书馆的documentation has a page for how to configure it as a foreground service here. You can also see an example of this in the library's Reference Application.
我建议您只需复制该设置代码即可使其正常工作。