Android Beacon库如何将前景服务转换为背景模式



我想实现的目标是,当用户输入地理申请时,信标前景服务将开始运行,在检测到一个信标后,我将杀死此前景服务并开始在其上运行它背景就像android-beacon-library-reference库上的示例代码一样。

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-beacon-library-reference库相同。

我不确定我是做对还是错,有人可以帮忙吗?

打开或关闭前景服务有点棘手,因为您试图更改已经在现有服务中幕后运行的多个执行线程的行为。/p>

所显示的代码中缺少的关键因素是,您还必须确保在切换之前已停止库扫描。这很复杂,因为它是异步的 - 扫描仪需要时间关闭其线程。

如果使用regionBootstrap,则呼叫regionBootstrap.disable()这样做。(如果不使用regionBootstrap,也可以使用beaconManager.unbind(...)。但是问题是,当扫描服务完全关闭时,这些API不会给您回调。并在关闭之前再次重新启动它可能会导致问题。除了使用计时器外,我在这里没有一个很好的建议 - 在停止和开始之间说一秒钟?

您可能还想查看有关类似设置的讨论:https://github.com/altbeacon/android-beacon-library/issues/845

相关内容

  • 没有找到相关文章

最新更新