我正在为一个购物中心构建一个应用程序,大量的信标安装距离彼此不远(假设距离约为20米)。
当用户走进这个商城时,即使没有打开应用程序,该应用程序也需要继续扫描信标。当检测到信标时,我将查询服务器以询问我是否需要以及向用户推送的本地通知。
我最初的计划是创建Service
,在START_STICKY
中返回onStartCommand()
,以确保即使应用程序被任务管理器杀死,服务也会重新启动。
此Service
将继续扫描信标。
事实上,这是我同事的现有方法。根据这位同事的说法,该服务几乎在应用程序被任务管理器杀死后立即启动。
但很快我发现这种方法存在问题 上述方法现在有两个主要问题:
虽然我知道JobScheduler
可以用来代替服务,也就是existing approach of Android Beacon Library,每15-25分钟执行一次扫描绝对不能满足我的要求,其中信标非常接近每个其他因此需要频繁扫描信标。
因此我想出了另一个计划:
这种方法的意图是:
通过阅读文档,我已经知道如何在后台扫描信标 但是如何利用Android Beacon Library在前台服务中进行扫描呢? 另外,您是否有任何问题可以通过上述方法发现/您是否有更好的建议来达到这些要求?
事实上,根据this post,后台服务在应用被杀后开始 5分钟。
但是,通过START_STICKY
onStartCommand()
返回Service
,它会立即重新启动。
那么,为什么即使在奥利奥之前也会有5分钟的延迟?
答案 0 :(得分:2)
这种方法很合理。 Android Beacon Library 2.15+本身支持前台服务作为扫描机制,可在Android 8上支持此类案例。See here了解更多信息。
棘手的部分是在使用Job Scheduler和服务之间来回切换进行扫描。我没有测试过这个,但我的建议是手动绑定到自定义Application类中的BeaconManager。 然后:
进入区域后,停止监控,然后取消绑定BeaconManager。
启动自定义前台服务
在前台服务中,禁用扫描作业,然后绑定到BeaconManager并开始测距
一旦没有信标被延长一段时间,停止测距,从BeaconManager解除绑定,启用扫描作业,再次绑定然后开始监控。
最后,退出前台服务
关于第二个问题,是的,START_STICKY将在大多数平台上快速重启服务。该库使用5分钟计时器,将AlarmManager作为备份,如果START_STICKY重启失败,将重新启动该服务。实际上,在典型的使用中,扫描服务的重启速度比五分钟快得多。