我对altbeacon library有疑问。我正在准备一个小型图书馆,其中一个模块可以在背景和前景中扫描信标。我在Github的一个库中找到了示例应用程序,并且已经测试了它们的代码(应用程序类),一切正常。用户转到任务切换器并在屏幕上滑动某个应用后,扫描将在后台继续进行。
但是我正在创建一个库,所以无法将代码粘贴到Application类中。为此,我需要执行以下操作:ApplicationClass中的onCreate方法中的MyLibrary.init(this)。所以我用与应用程序类完全相同的代码编写了一个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库实现这一目标?
答案 0 :(得分:0)
我认为您太难了。
Android信标库旨在在后台扫描信标,并在应用被杀死以扫描信标后自动重启自身。它可以自动完成所有这些工作,而无需您创建任何包装服务或工作管理器。这样的包装器可能会使事情变得更复杂,并产生意想不到的副作用。
如果您要制作自己的包装Android Beacon库的库,则上述方法也适用,前提是该库的AndroidManifest.xml条目已合并到您库的AndroidManifest.xml中。这将在清单中公开许多内部Android Beacon库服务,包括StartupBroadcastReceiver,BeaconService和ScanJob。这三个服务是完成第一段中的功能所必需的。
如果您已完成上述操作,则要做的唯一另一件事就是提供一些代码钩子,以在应用程序启动时设置信标监视/范围。可以简单地是像new MyLibraryManager().start(Context context);
这样的库中的POJO方法调用(您可能必须传递Context对象,因为创建Android Beacon库的BeaconManager时需要此对象。)
要在应用程序被终止后自动重启扫描,必须在应用程序启动后以某种方式执行上述挂钩。 (磁带库自动重启是上述服务,但是您仍然需要打电话告诉磁带库是否开始扫描以及使用什么设置。)
最简单的解决方案是指示使用您的库的开发人员将调用置于上面描述的钩子(例如new MyLibraryManager().start(Context context);
)内自己的自定义Application#onCreate()
方法中。您也许可以使用不需要此功能的BroadcastReceiver找出其他一些聪明的解决方案。