过去,我们已成功使用AlarmManager定期扫描BLE信标(广告商),但是我们遇到了Android 8.1+的非常常见的问题。具体来说-当我们的应用在后台运行了一段时间后,我们的BroadcastReceiver不会被AlarmManager触发。
David Young出色的Blog条目在这里描述了这一常见挑战: http://www.davidgyoungtech.com/2017/08/07/beacon-detection-with-android-8
它阐明了OS扫描新信标时,可以使用StartScan设置Android 8.1+来调用BroadcastReceiver。都好。博客条目继续说明,尽管此新信标仍然可扫描,但不会发生BroadcastReceiver触发-即使在扫描新信标时(具有与第一个扫描到的信标不同的ID)。不好。 Blog条目继续描述了如何进行应用程序显式扫描-但是扫描只能由Job Scheduler启动,间隔间隔为每25分钟一次。
在我们的应用程序中,我们需要查看何时重新扫描每个信标(即它刚刚被打开或进入范围内)。我们不需要跟踪它是否仍可扫描。重要的是-我们必须能够找到仍在扫描范围内的其他信标,这些信标会进入范围或被打开。同样重要的是,我们可以为这些额外的信标快速获取BroadcastReceiver(不超过30秒)。
是否有一项支持重新启动扫描的技术,以便在新扫描(即第一次扫描)每个信标时为每个信标获取BroadcastReceiver?例如,当第一次扫描信标时,我们可以停止并重新开始扫描吗?必须有一种方法可以做到这一点。我无法相信,如果已经扫描了另一个信标并且仍然可以扫描,则Android会将新的信标检测限制为每25分钟一次。