gpt4 book ai didi

android - 我可以在前台服务中使用 Android Beacon 库吗,即使是在 Android 8 (Oreo) 上?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:33 24 4
gpt4 key购买 nike

我想要实现的目标

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

我打算做什么

我最初的计划是创建一个 Service,在 onStartCommand() 中返回 START_STICKY 以确保该服务会自行重启甚至该应用程序也被任务管理器杀死。

服务将持续扫描信标。

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

问题

但是很快我发现这种做法是有问题的。
上述方法现在有 2 个主要问题:

我的下一个计划

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

于是我想出了另一个方案:

  1. 使用 Android Beacon 库运行后台检测
  2. 一旦已检测到过滤器列表中的第一个信标,启动前台服务(即使在 Android 8 中也不会被杀死)持续扫描信标
  3. 当过滤器中的所有信标都退出后,停止上述前台服务。安卓信标图书馆应恢复其后台检测状态。

这种方法的目的是:

  1. 根据他们的 documentation,利用 Android Beacon Library 的后台检测来节省电池电量
  2. 由于 Android 8 的内置长扫描间隔限制,Android Beacon 库不再处理 Android 8
  3. 扫描甚至在 Android 8 上继续进行,因为我要使用前台服务

我的主要问题

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

我的另一个问题

事实上根据this post ,后台服务在应用被终止后 5 分钟 启动。
但是通过在 ServiceonStartCommand() 中返回 START_STICKY,它几乎立即重新启动。
那么,为什么会有5分钟的延迟,即使是pre-Oreo?

最佳答案

这种方法是合理的。 Android Beacon Library 2.15+ 原生支持前台服务作为扫描机制,以支持 Android 8 上的此类情况。See here了解更多信息。

棘手的部分是在使用 Job Scheduler 和服务进行扫描之间来回切换。我没有对此进行测试,但我的建议是手动绑定(bind)到自定义应用程序类中的 BeaconManager。然后:

  1. 进入区域后,停止监听,然后解绑BeaconManager。

  2. 启动自定义前台服务

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

  4. 一旦一段时间内没有信标被测距,就停止测距,解除与 BeaconManager 的绑定(bind),启用扫描作业,再次绑定(bind),然后开始监控。

  5. 最后退出前台服务

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

关于android - 我可以在前台服务中使用 Android Beacon 库吗,即使是在 Android 8 (Oreo) 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49103671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com