Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android beacon library如何将前台服务转换为后台模式?_Android_Beacon_Altbeacon_Ibeacon Android - Fatal编程技术网

Android beacon library如何将前台服务转换为后台模式?

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

我想要实现的是,当用户进入地理围栏时,信标前台服务将开始运行,在检测到一个信标后,我将终止此前台服务并开始在后台运行它,就像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!!)
    }
}

对于
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实例。就一个关于计时器的问题,你认为一秒钟就足够了吗?