【问题标题】:Android beacon library how to turn foreground service to background mode?Android信标库如何将前台服务转为后台模式?
【发布时间】:2019-08-05 04:47:41
【问题描述】:

我想要实现的是,当用户进入地理围栏时,信标前台服务将开始运行,在检测到一个信标后,我将终止该前台服务并开始在后台运行它,就像@上的示例代码一样987654321@图书馆。

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

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

【问题讨论】:

    标签: android beacon altbeacon ibeacon-android


    【解决方案1】:

    打开或关闭前台服务有点棘手,因为您正在尝试更改已在现有服务的后台运行的多个执行线程的行为。

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

    如果使用regionBootstrap,则调用regionBootstrap.disable() 会执行此操作。 (如果不使用regionBootstrap,也可以使用beaconManager.unbind(...))。但问题是,当扫描服务完全关闭时,这些 API 不会给您回调。并且在关闭之前再次重新启动它可能会导致问题。我在这里没有什么好的建议,也许除了使用计时器——比如停止和开始之间有一秒钟?

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

    【讨论】:

    • 感谢大卫,这实际上解决了我的问题。等待 1 秒并重新启动以设置 RegionBootstrap 实例。就一个关于定时器的问题,你觉得1秒够吗?
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2011-09-15
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多