iBeacon背景扫描

6
我已经编写了一个自己的BLE扫描服务,每3-5秒由闹钟触发。它会在1.1秒内扫描周围的信标,然后将RSSI信号转换为大致的接近度。
现在,我正在考虑Radius Networks Android iBeacon服务,但我想知道如何实现相同的后台扫描。
例如:我希望信标扫描在后台启动并运行,并通过广播接收器接收意图以决定我对扫描到的信标所做的操作。
是否有一些示例,并且能否估计这会消耗多少电量?
1个回答

8
Radius Networks的Android iBeacon Library正是这样做的。要在后台运行它,您所要做的就是将IBeaconManager绑定到具有长生命周期的对象上。这可以是自定义的android.app.Application对象或自己的服务。由于您已经为应用程序编写了自己的服务,因此您可以轻松地将IBeaconManager绑定到该服务,并且只要服务运行,它就会保持活动状态。如果您希望,您还可以使用您的服务发送广播意图,但对于大多数用例来说,这可能并不必要。
至于电池使用情况,该库的参考应用程序有一个示例,说明如何设置库的后台模式,使扫描发生得更少,从而节省电池。该参考应用程序中的相关代码如下:
    @Override 
    protected void onPause() {
            super.onPause();
            if (iBeaconManager.isBound(this)) iBeaconManager.setBackgroundMode(this, true);                    
    }
    @Override 
    protected void onResume() {
            super.onResume();
            if (iBeaconManager.isBound(this)) iBeaconManager.setBackgroundMode(this, false);                    
    } 

将背景模式设置为true会减少蓝牙扫描的频率,只有每5分钟扫描一次 - 类似于iOS的做法。 根据对Nexus 4的测试,在此模式下,手机的总体电池消耗从95mA降至55mA(这两个数字都包括操作系统的总体耗电量)。
充分披露:我在Radius Networks工作,是Android iBeaconLibrary的主要作者。

嗨,David,非常感谢您的评论。对于我的特定演示,我选择了服务和警报,但如果不是这样,我完全会选择您的API。 - Sven Haiges
我发现IBeacon类和scanFromRecord方法非常有帮助。唯一让我无法理解的是第216行在做什么。显然检测到了Estimote信标,但随后会返回一个“空”的IBeacon类。这是遗留代码吗?我刚刚收到了来自Estimote的iBeacons并且它们可以正常工作。顺便说一句,我很想联系你们公司并尝试一下你们的信标和服务。我们如何直接联系呢? - Sven Haiges
了解您的演示。这是一个开源项目,因此我一直在寻找意见和合作者。也许我们可以一起合作。 - davidgyoung
当检测到iBeacons时,可以使其发送可配置的意图。至于您在第216行的问题,那是针对不支持iBeacon配置文件的传统Estimote信标。他们发货的早期单位并不严格兼容iBeacon。有关项目特定问题和功能请求,最好联系的方式是在此处打开问题:https://github.com/RadiusNetworks/android-ibeacon-service/issues/ 我很乐意在那里分享我的直接电子邮件。 - davidgyoung
如果我杀掉应用程序,服务是否会继续运行?我需要做些什么来保持服务在杀掉应用程序后继续运行? - Otuyh
@Otuyh,这个问题中提到的库已经被更通用的信标版本替代,称为Android Beacon Library,网址在这里:http://altbeacon.github.io/android-beacon-library/。您可以在此页面上阅读有关应用程序在被终止后如何工作的更多信息:http://altbeacon.github.io/android-beacon-library/resume-after-terminate.html。 - davidgyoung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接