我可以在前台服务中使用Android Beacon Library,即使在Android 8(Oreo)上也可以吗?

时间:2018-03-05 04:53:04

标签: android service ibeacon beacon android-ibeacon

我想要实现的目标

我正在为一个购物中心构建一个应用程序,大量的信标安装距离彼此不远(假设距离约为20米)。
当用户走进这个商城时,即使没有打开应用程序,该应用程序也需要继续扫描信标。当检测到信标时,我将查询服务器以询问我是否需要以及向用户推送的本地通知。

我计划做什么

我最初的计划是创建Service,在START_STICKY中返回onStartCommand(),以确保即使应用程序被任务管理器杀死,服务也会重新启动。

Service将继续扫描信标。

事实上,这是我同事的现有方法。根据这位同事的说法,该服务几乎在应用程序被任务管理器杀死后立即启动。

问题

但很快我发现这种方法存在问题 上述方法现在有两个主要问题:

我的下一个计划

虽然我知道JobScheduler可以用来代替服务,也就是existing approach of Android Beacon Library,每15-25分钟执行一次扫描绝对不能满足我的要求,其中信标非常接近每个其他因此需要频繁扫描信标。

因此我想出了另一个计划:

  1. 使用Android Beacon Library运行背景检测
  2. 一旦 已检测到过滤器列表中的第一个信标,启动前景 服务(即使在Android 8中也不会被杀死) 持续扫描信标
  3. 当退出过滤器中的所有信标时,请停止上述前台服务。 Android Beacon 图书馆应恢复到其背景检测状态。
  4. 这种方法的意图是:

    1. 根据他们的documentation
    2. ,利用Android Beacon Library的背景检测功能节省电池电量
    3. 由于内置的​​长扫描间隔限制,Android Beacon Library处理Android 8的步骤
    4. 因为我要使用前台服务
    5. ,即使在Android 8上扫描也会继续

      我的主要问题

      通过阅读文档,我已经知道如何在后台扫描信标 但是如何利用Android Beacon Library在前台服务中进行扫描呢? 另外,您是否有任何问题可以通过上述方法发现/您是否有更好的建议来达到这些要求?

      我的另一个问题

      事实上,根据this post,后台服务在应用被杀后开始 5分钟
      但是,通过START_STICKY onStartCommand()返回Service,它会立即重新启动。
      那么,为什么即使在奥利奥之前也会有5分钟的延迟?

1 个答案:

答案 0 :(得分:2)

这种方法很合理。 Android Beacon Library 2.15+本身支持前台服务作为扫描机制,可在Android 8上支持此类案例。See here了解更多信息。

棘手的部分是在使用Job Scheduler和服务之间来回切换进行扫描。我没有测试过这个,但我的建议是手动绑定到自定义Application类中的BeaconManager。 然后:

  1. 进入区域后,停止监控,然后取消绑定BeaconManager。

  2. 启动自定义前台服务

  3. 在前台服务中,禁用扫描作业,然后绑定到BeaconManager并开始测距

  4. 一旦没有信标被延长一段时间,停止测距,从BeaconManager解除绑定,启用扫描作业,再次绑定然后开始监控。

  5. 最后,退出前台服务

  6. 关于第二个问题,是的,START_STICKY将在大多数平台上快速重启服务。该库使用5分钟计时器,将AlarmManager作为备份,如果START_STICKY重启失败,将重新启动该服务。实际上,在典型的使用中,扫描服务的重启速度比五分钟快得多。