使用信标在后台同步Android应用和BLE

问题描述 投票:1回答:1

我是BLE Beacons的新手。

我有一个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类中的syncnizeBleWithTheApp()使用Activity MainActivity类中的代码,是否意味着我需要该应用打开该MainActivity?我还能在后台触发同步吗?

android bluetooth-lowenergy altbeacon ibeacon-android android-ibeacon
1个回答
2
投票
几点:

  1. 如果即使信标仍然存在也要获取更新,则除了RegionBootstrap外,还必须使用范围API。通过在startRangingBeaconsInRegion(...)回调中调用didDetermineStateForRegion开始调整范围。
  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上的自定义应用杀手ers,这可能无法满足您对这些制造商生产的手机的要求。看到这里:http://www.davidgyoungtech.com/2019/04/30/the-rise-of-the-nasty-forks

© www.soinside.com 2019 - 2024. All rights reserved.