【问题标题】:Using Beacons to synchronise an Android app and a BLE in the background使用 Beacons 在后台同步 Android 应用和 BLE
【发布时间】:2019-10-02 11:47:53
【问题描述】:

我是 BLE 信标的新手。

当我的移动应用程序中有新数据可用时,我有一个 BLE 设备需要不时更新,反之亦然 - 当 BLE 做了应用程序应该知道的事情时。

换言之,BLE 设备需要与移动应用“同步”。

如果用户打开应用程序,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) 如果自定义 Application 类中的 synchronizeBleWithTheApp() 使用 Activity MainActivity 类中的代码,是否意味着我需要应用程序才能打开该 MainActivity?我还能在后台触发同步吗?

【问题讨论】:

  • 如果您计划在后台运行您的应用程序,那么您必须实现前台服务并将所有逻辑从活动移动到服务级别或应用程序级别。如果您不能这样做,那么由于后台限制,您的应用永远不会在 Android OS >= 8.0 中运行
  • @MD 你写这个是为了回答问题 2 对吗?
  • 是的。这对你有意义吗?
  • 有道理,是的,我认为活动已死,但服务/应用程序组件仍在运行。但是,为什么在低于 Android 8 的版本中我可以在我的 Activity 中实现同步逻辑?
  • 在 Android 8 之前,应用程序在后台运行没有时间限制,只要有足够的可用内存,启动的活动就会无限期地保持活动状态。对于 Android 8+,这不再适用。包括活动在内的应用程序在大约后被杀死。在后台播放 10 分钟。

标签: android bluetooth-lowenergy altbeacon ibeacon-android android-ibeacon


【解决方案1】:

几点:

  1. 如果您想在信标保持存在的情况下获得更新,除了 RegionBootstrap 之外,您还必须使用测距 API。通过在didDetermineStateForRegion 回调中调用startRangingBeaconsInRegion(...) 开始测距。

  2. 您不应将任何背景代码放在 Activity 类中,因为如果不可见,Android 可能会终止 Activity。放置此代码的最简单位置是在您使用 RegionBootastrap 的自定义 Application 类中(或在从自定义 Application 类初始化和访问的自定义类中)。

您还可能需要前台服务来让您的应用在 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

【讨论】:

  • 谢谢!!!请澄清几点: 1. 我使用 BeaconBootstrap 只使用了一次监控。这用于知道 BLE 何时在区域中,因此我可以开始连续测距过程 - 实际同步发生在哪里? 2. 测距将允许我触发同步(每 X 秒/分钟甚至距离),因此监控不适合,因为它仅适用于进入/退出区域更合乎逻辑? 3. 将测距触发的所有代码放在自定义应用程序类或某些服务中——这只是因为应用程序被杀死而可以运行?
  • 您需要将代码放在自定义 Application 类中,原因有两个 (1),这样如果 Activity 从未启动,代码就会执行——这是库重新启动您的应用程序的情况信标检测的背景。 (2) 以防 Activity 消失并在应用程序的其他部分仍在运行时被垃圾收集。
猜你喜欢
  • 2015-12-12
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
相关资源
最近更新 更多