如何使用工作管理器解决用户杀死应用程序后退出区域的问题?

问题描述 投票:0回答:1

我有altbeacon library的问题。我正在准备一个小型库,其中一个模块扫描背景和前景中的信标。我在Github上的一个库中找到了示例应用程序,我已经测试了他们的代码(应用程序类),一切正常。用户进入任务切换器并从屏幕上滑动应用程序后,将在后台继续扫描。

但我正在创建一个库,所以我无法将我的代码粘贴到Application类中。考虑到这一点,我需要做这样的事情:MyLibrary.init(this)在Ap​​plicationClass中的onCreate方法中。所以我编写了一个BeaconService类,其代码与应用程序类完全相同。我已经传递给这个类应用程序上下文(我通过调试我的代码检查了我的BeaconService应用程序上下文)。之后当应用程序没有通过从任务切换器交换杀死时,evrything工作完美。杀死应用程序后,我退出了区域事件,即使信标距离设备大约20厘米,我也无法继续扫描。

我在altbeacon Github上创建了一个问题(你可以找到我的示例代码并记录here),我得到的答案是库不符合我的要求。此外,如果我有进一步的问题如何解决我的问题,我应该在stackoverflow上询问。

所以我有一个想法,也许我可以使用WorkManager并一次又一次地重新安排扫描信标工作者(OneTimeWork)。这可能是围绕从Android 8+引入的调度后台任务的延迟限制的一种方法。

承诺的示例代码:

class BeaconWorker(appCtx: Context, workerParameters: WorkerParameters) : CoroutineWorker(appCtx, workerParameters) {

override val coroutineContext: CoroutineDispatcher
    get() = Dispatchers.Default

override suspend fun doWork() = supervisorScope {
    // rescheduling worker
    if(isActive) {
        enqueNextWork()
    }
    // make scan (This could be only one scan with list of found beacons)
    val beacons = makeScan()
    Result.success()
  }
}

如何使用altbeacon库实现这一目标?

android altbeacon android-workmanager
1个回答
0
投票

我觉得你这太​​难了。

Android Beacon Library设计用于在后台扫描信标,并在应用程序被杀死后自动重启以扫描信标。它可以自动开箱即用,无需您创建任何包装服务或工作管理器。这种包装可能会使事情变得更复杂并导致意想不到的副作用。

如果您创建自己的包装Android Beacon库的库,则上述方法也适用,前提是库的AndroidManifest.xml条目已合并到库的AndroidManifest.xml中。这将在清单中公开许多内部Android Beacon Library服务,包括StartupBroadcastReceiver,BeaconService和ScanJob。完成第一段中的功能需要这三项服务。

如果您已经完成了上述操作,那么您需要做的唯一事情就是提供一些代码挂钩来设置应用程序启动时的信标监视/测距。这可以简单地是你的库中的POJO方法调用,如new MyLibraryManager().start(Context context);(你可能必须传递一个Context对象,因为这需要创建Android Beacon Library的BeaconManager。)

对于应用程序被杀死后自动扫描重新启动,应用程序启动时必须以某种方式执行上述挂钩。 (库自动重启是上述服务,但您仍需要调用以告知库是否开始扫描以及使用何种设置。)

最简单的解决方案是指示使用您的库的开发人员将调用放在他们自己的自定义new MyLibraryManager().start(Context context);方法中的上面描述的钩子(例如Application#onCreate())。您可能能够使用不需要此功能的BroadcastReceiver找出其他一些聪明的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.