Android beacon library如何将前台服务转换为后台模式?
我想要实现的是,当用户进入地理围栏时,信标前台服务将开始运行,在检测到一个信标后,我将终止此前台服务并开始在后台运行它,就像android信标库参考库中的示例代码一样Android beacon library如何将前台服务转换为后台模式?,android,beacon,altbeacon,ibeacon-android,Android,Beacon,Altbeacon,Ibeacon Android,我想要实现的是,当用户进入地理围栏时,信标前台服务将开始运行,在检测到一个信标后,我将终止此前台服务并开始在后台运行它,就像android信标库参考库中的示例代码一样 private fun monitorBeacons(startForegroundService: Boolean) { var beaconManager = WolApp.appContext?.beaconManager if (beaconManager == null) { WolApp
private fun monitorBeacons(startForegroundService: Boolean) {
var beaconManager = WolApp.appContext?.beaconManager
if (beaconManager == null) {
WolApp.appContext?.beaconManager = BeaconManager.getInstanceForApplication(WolApp.appContext!!)
beaconManager = WolApp.appContext?.beaconManager
beaconManager?.backgroundMode = true
beaconManager?.beaconParsers?.clear()
beaconManager?.beaconParsers?.add(BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"))
beaconManager?.removeAllMonitorNotifiers()
}
if (startForegroundService) {
setupForegroundNotificationService(WolApp.appContext!!)
} else {
WolApp.appContext?.regionBootstrap?.disable()
WolApp.appContext?.regionBootstrap = null
try {
WolApp.appContext?.beaconManager?.disableForegroundServiceScanning()
} catch (e: IllegalStateException) {}
if (beaconManager?.scheduledScanJobsEnabled == false) {
beaconManager.setEnableScheduledScanJobs(true)
beaconManager.backgroundBetweenScanPeriod = BeaconManager.DEFAULT_BACKGROUND_BETWEEN_SCAN_PERIOD
beaconManager.backgroundScanPeriod = BeaconManager.DEFAULT_BACKGROUND_SCAN_PERIOD
}
}
if (WolApp.appContext?.regionBootstrap == null) {
WolApp.appContext?.regionBootstrap = RegionBootstrap(WolApp.appContext!!, regions)//regions are some iBeacon regions
}
if (!startForegroundService) {
WolApp.appContext?.backgroundPowerSaver = BackgroundPowerSaver(WolApp.appContext!!)
}
}
对于setupForegroundNotificationService
方法与android信标库参考
库相同
private fun monitorBeacons(startForegroundService: Boolean) {
var beaconManager = WolApp.appContext?.beaconManager
if (beaconManager == null) {
WolApp.appContext?.beaconManager = BeaconManager.getInstanceForApplication(WolApp.appContext!!)
beaconManager = WolApp.appContext?.beaconManager
beaconManager?.backgroundMode = true
beaconManager?.beaconParsers?.clear()
beaconManager?.beaconParsers?.add(BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"))
beaconManager?.removeAllMonitorNotifiers()
}
if (startForegroundService) {
setupForegroundNotificationService(WolApp.appContext!!)
} else {
WolApp.appContext?.regionBootstrap?.disable()
WolApp.appContext?.regionBootstrap = null
try {
WolApp.appContext?.beaconManager?.disableForegroundServiceScanning()
} catch (e: IllegalStateException) {}
if (beaconManager?.scheduledScanJobsEnabled == false) {
beaconManager.setEnableScheduledScanJobs(true)
beaconManager.backgroundBetweenScanPeriod = BeaconManager.DEFAULT_BACKGROUND_BETWEEN_SCAN_PERIOD
beaconManager.backgroundScanPeriod = BeaconManager.DEFAULT_BACKGROUND_SCAN_PERIOD
}
}
if (WolApp.appContext?.regionBootstrap == null) {
WolApp.appContext?.regionBootstrap = RegionBootstrap(WolApp.appContext!!, regions)//regions are some iBeacon regions
}
if (!startForegroundService) {
WolApp.appContext?.backgroundPowerSaver = BackgroundPowerSaver(WolApp.appContext!!)
}
}
我不太确定我这样做是对是错,有人能帮忙吗?打开或关闭前台服务有点棘手,因为您正试图更改现有服务中已在后台运行的多个执行线程的行为 显示的代码中缺少的关键点是,在切换之前,还必须确保已停止库的扫描。这很复杂,因为它是异步的——扫描器关闭线程需要时间 如果使用
regionBootstrap
,则调用regionBootstrap.disable()
可执行此操作。(如果不使用regionBootstrap
,也可以使用beaconManager.unbind(…)
)。但问题是,当扫描服务完全关闭时,这些API不会给您回调。在关机前重新启动可能会导致问题。我这里没有什么好建议,除了可能使用计时器——比如说在停止和启动之间的一秒钟
您可能还想看看关于类似设置的讨论:
谢谢大卫,这实际上解决了我的问题。等待1秒钟并重新启动以设置RegionBootstrap实例。就一个关于计时器的问题,你认为一秒钟就足够了吗?