首页 > 解决方案 > 如何使用工作管理器解决应用被用户杀死后退出区域的问题?

问题描述

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

但是我正在创建一个库,所以我不能将我的代码粘贴到 Application 类中。为此,我需要执行以下操作:MyLibrary.init(this) 在 ApplicationClass 的 onCreate 方法中。因此,我编写了一个 BeaconService 类,其代码与应用程序类中的代码完全相同。我已经传递给这个类应用程序上下文(我通过调试我的代码检查了我是否在我的 BeaconService 应用程序上下文中)。之后,当应用程序没有通过从任务切换器中切换而被杀死时,一切都可以完美运行。杀死应用程序后,我退出了区域事件,即使信标距离设备约 20 厘米,我也无法继续扫描。

我在 altbeacon Github 上创建了一个问题(您可以在此处找到我的示例代码和日志),我得到的答案是库不是为我的要求而设计的。此外,如果我还有其他问题如何解决我的问题,我应该在 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 库来实现这一点?

标签: androidaltbeaconandroid-workmanager

解决方案


我认为你让这太难了。

Android 信标库旨在在后台扫描信标,并在应用程序被终止后自动重启以扫描信标。这一切都是开箱即用的,您无需创建任何包装服务或工作管理器。这样的包装器可能会使事情变得更加复杂并导致意想不到的副作用。

如果您正在制作自己的包装 Android Beacon 库的库,上述方法也适用,前提是该库的 AndroidManifest.xml 条目已合并到您的库的 AndroidManifest.xml 中。这将在清单中公开许多内部 Android 信标库服务,包括 StartupBroadcastReceiver、BeaconService 和 ScanJob。这三个服务是完成第一段中的功能所必需的。

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

为了在应用程序被杀死后自动重新启动扫描,上述钩子必须在应用程序重新启动时以某种方式执行。(库自动重启是上面描述的服务,但是你仍然需要调用来告诉库是否开始扫描以及使用什么设置。)

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


推荐阅读