使用信标在后台同步 Android 应用程序和 BLE
Using Beacons to synchronise an Android app and a BLE in the background
我是 BLE 信标的新手。
我有一个 BLE 设备,当我的移动应用程序中有新数据可用时,它需要每隔一段时间更新一次,反之亦然 - 当 BLE 做了应用程序应该知道的事情时。
换句话说,BLE 设备需要 "synchronized" 与移动应用程序。
如果用户打开应用程序,BLE 正在同步并且一切正常。
但我希望此同步在后台运行,即使用户在 1、2 天甚至几周内没有打开该应用程序,所以下次打开该应用程序时,已经有来自应用程序内的 BLE 设备,反之亦然 - 即使用户没有打开应用程序,应用程序也会为应该发生的事件更新 BLE(例如命令 BLE 在 10 分钟内闪烁颜色)。
我尝试将 Android 蓝牙库与 RegionBootstrap 一起使用,但我很困惑在我的场景中是否可以使用监控。
这是我的自定义应用程序 onCreate() 中的代码:
mBeaconManager = BeaconManager.getInstanceForApplication(this);
mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_PARSER_LAYOUT));
mBeaconManager.setRegionStatePersistenceEnabled(false);
mBeaconManager.setBackgroundBetweenScanPeriod(10000l);
mBeaconManager.setForegroundBetweenScanPeriod(10000l);
mBeaconManager.setBackgroundScanPeriod(1100l);
mBeaconManager.setForegroundScanPeriod(1100l);
region = new Region(getPackageName(),Identifier.parse(MY_BLE_BEACON_UID), null, null);
mRegionBootstrap = new RegionBootstrap(this, region);
这是我的触发事件:
@Override
public void didEnterRegion(Region region) {
Log.e(TAG, "didEnterRegion: ");
synchronizeBleWithTheApp();
playSoundEnterRegion();
}
@Override
public void didExitRegion(Region region) {
Log.e(TAG, "didExitRegion: ");
playSoundExitRegion();
}
private void synchronizeBleWithTheApp() {
// 1) Check if there is any new data the BLE is interested in, if yes the app should push it to the BLE in the background.
// 2) Check if there is any new data in the BLE the app is interested in, if yes fetch it from the BLE in the background.
}
我的问题是:
1) 我是否应该在我的案例中使用监控?我的意思是,即使设备每隔 X 分钟仍在该区域中,我也想继续尝试同步。 RegionBootstrap 适合这种情况吗?
现在,didEnterRegion 被触发一次,30~ 秒后 onExitRegion 被触发,尽管 BLE 信标正在传输,这让我感到困惑。
2) 如果自定义应用程序 class 中的 synchronizeBleWithTheApp() 使用 Activity MainActivity class 中的代码,这是否意味着我需要该应用程序打开 MainActivity?我还能在后台触发同步吗?
几点:
如果您希望即使在信标保持存在时也能获得更新,除了 RegionBootstrap 之外,您还必须使用测距 API。通过在 didDetermineStateForRegion
回调中调用 startRangingBeaconsInRegion(...)
开始测距。
您不应该在 Activity class 中放置任何后台代码,因为 Android 如果不可见可能会杀死 Activity。放置此代码的最简单位置是在您使用 RegionBootastrap 的自定义应用程序 class 中(或在从自定义应用程序 class 初始化和访问的自定义 class 中)。
在 Android 8+ 上,您可能还需要前台服务才能让您的应用 运行 在后台运行超过 10 分钟。该库使添加它变得容易,而无需编写您自己的前台服务。请在此处查看库文档:https://altbeacon.github.io/android-beacon-library/foreground-service.html
如果在 Android 7+ 一段时间后发现检测在后台停止(导致区域退出事件),您可能需要添加代码以强制长时间后台扫描:https://github.com/AltBeacon/android-beacon-library/pull/529
最后,小心中国 OEM 上的自定义应用程序杀手,它们可能无法满足您对这些制造商制造的手机的要求。看这里:http://www.davidgyoungtech.com/2019/04/30/the-rise-of-the-nasty-forks
我是 BLE 信标的新手。
我有一个 BLE 设备,当我的移动应用程序中有新数据可用时,它需要每隔一段时间更新一次,反之亦然 - 当 BLE 做了应用程序应该知道的事情时。
换句话说,BLE 设备需要 "synchronized" 与移动应用程序。
如果用户打开应用程序,BLE 正在同步并且一切正常。
但我希望此同步在后台运行,即使用户在 1、2 天甚至几周内没有打开该应用程序,所以下次打开该应用程序时,已经有来自应用程序内的 BLE 设备,反之亦然 - 即使用户没有打开应用程序,应用程序也会为应该发生的事件更新 BLE(例如命令 BLE 在 10 分钟内闪烁颜色)。
我尝试将 Android 蓝牙库与 RegionBootstrap 一起使用,但我很困惑在我的场景中是否可以使用监控。
这是我的自定义应用程序 onCreate() 中的代码:
mBeaconManager = BeaconManager.getInstanceForApplication(this);
mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_PARSER_LAYOUT));
mBeaconManager.setRegionStatePersistenceEnabled(false);
mBeaconManager.setBackgroundBetweenScanPeriod(10000l);
mBeaconManager.setForegroundBetweenScanPeriod(10000l);
mBeaconManager.setBackgroundScanPeriod(1100l);
mBeaconManager.setForegroundScanPeriod(1100l);
region = new Region(getPackageName(),Identifier.parse(MY_BLE_BEACON_UID), null, null);
mRegionBootstrap = new RegionBootstrap(this, region);
这是我的触发事件:
@Override
public void didEnterRegion(Region region) {
Log.e(TAG, "didEnterRegion: ");
synchronizeBleWithTheApp();
playSoundEnterRegion();
}
@Override
public void didExitRegion(Region region) {
Log.e(TAG, "didExitRegion: ");
playSoundExitRegion();
}
private void synchronizeBleWithTheApp() {
// 1) Check if there is any new data the BLE is interested in, if yes the app should push it to the BLE in the background.
// 2) Check if there is any new data in the BLE the app is interested in, if yes fetch it from the BLE in the background.
}
我的问题是:
1) 我是否应该在我的案例中使用监控?我的意思是,即使设备每隔 X 分钟仍在该区域中,我也想继续尝试同步。 RegionBootstrap 适合这种情况吗?
现在,didEnterRegion 被触发一次,30~ 秒后 onExitRegion 被触发,尽管 BLE 信标正在传输,这让我感到困惑。
2) 如果自定义应用程序 class 中的 synchronizeBleWithTheApp() 使用 Activity MainActivity class 中的代码,这是否意味着我需要该应用程序打开 MainActivity?我还能在后台触发同步吗?
几点:
如果您希望即使在信标保持存在时也能获得更新,除了 RegionBootstrap 之外,您还必须使用测距 API。通过在
didDetermineStateForRegion
回调中调用startRangingBeaconsInRegion(...)
开始测距。您不应该在 Activity class 中放置任何后台代码,因为 Android 如果不可见可能会杀死 Activity。放置此代码的最简单位置是在您使用 RegionBootastrap 的自定义应用程序 class 中(或在从自定义应用程序 class 初始化和访问的自定义 class 中)。
在 Android 8+ 上,您可能还需要前台服务才能让您的应用 运行 在后台运行超过 10 分钟。该库使添加它变得容易,而无需编写您自己的前台服务。请在此处查看库文档:https://altbeacon.github.io/android-beacon-library/foreground-service.html
如果在 Android 7+ 一段时间后发现检测在后台停止(导致区域退出事件),您可能需要添加代码以强制长时间后台扫描:https://github.com/AltBeacon/android-beacon-library/pull/529
最后,小心中国 OEM 上的自定义应用程序杀手,它们可能无法满足您对这些制造商制造的手机的要求。看这里:http://www.davidgyoungtech.com/2019/04/30/the-rise-of-the-nasty-forks