Android L之前Android Altbeacon库使用后台运行服务来扫描BLE信标。默认扫描时间在前景循环中为1.1秒,在后台每5分钟为10秒。此外,对于后台任务,警报管理器用于唤醒应用程序。
考虑到不允许长时间运行的后台服务,我正在研究Android Oreo中类似的设置是如何工作的。我正在经历 http://www.davidgyoungtech.com/2017/08/07/beacon-detection-with-android-8 它确实清楚了,但我仍然不完全清楚扫描如何与蓝牙扫描API和作业调度程序相结合。
那么如何结合使用基于作业调度程序的周期性调度来监视和范围信标的低功耗扫描?如果有人可以提供一个很棒的例子。
更具体一点 -
答案 0 :(得分:3)
了解低功耗扫描如何在低级别工作至关重要:
低功耗扫描依赖于将蓝牙LE模式与蓝牙芯片上的硬件过滤器相匹配。如果它与传入的数据包匹配,则芯片会通知操作系统,操作系统向应用程序发送一个意图,将其唤醒以处理数据包。
以上内容依赖于Intent提供的过滤扫描组合(Android 8中的新API)。
当计划扫描作业以Android Beacon Library结束时,此基于意图的传送设置为由操作系统和蓝牙芯片处理。最终结果是,如果检测到新的信标,则将很快地由广播的接收器处理。这可以在几秒钟内向应用程序发送监控回调,而不是等待下一个预定作业的15分钟。
当滤镜与附近的蓝牙设备不匹配时,这一切都可以使用。如果一个已经在附近,那么Intent将在100ms左右被发送,这是一种非常低效的CPU获取持续更新的方式,这会使低功耗API失败,并且会导致应用程序不断运行且符合条件Android 8终止。
使用的过滤器匹配任何信标。这样做是为了节省过滤器,因为它们是有限的硬件资源。出于这个原因,如果已知信标已经存在,则不使用这些扫描API,因为它会立即匹配数据包并破坏技术的目的。底线:如果扫描作业以信标可见结束,则不执行低功率扫描。
您不能将预定作业设置为超过15分钟执行。这是操作系统限制。扫描周期之间的10分钟可以工作,但是如果周期,库只会在结束时提供扫描结果,所以这可能没有用。可以修改库以便在每个扫描作业上扫描最多10分钟,但是目前它不会执行此操作,并且当您点击它时会留下5分钟未覆盖。
如果您真的想在Android 8+的后台进行持续的BLE扫描,那么操作系统允许的方法是使用前台服务显示图标,以便用户知道它正在运行。但要注意在消费者应用程序中执行此操作,因为电池消耗非常大,用户可能会在将应用程序归咎于电池耗尽后卸载应用程序。但是,对于特殊用例,这可能是可以接受的。