首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在背景模式下开始扫描需要几分钟(使用AltBeacons)

在背景模式下开始扫描需要几分钟(使用AltBeacons)
EN

Stack Overflow用户
提问于 2015-11-23 11:10:43
回答 2查看 508关注 0票数 0

我试图监视背景和前景模式下的信标,只分配第一个ID,然后得到检测到的信标的完整UUID。

使用didEnterRegion方法,该区域的第二个ID为null,所以当我进入一个区域以检测第二个ID时,我所做的就是启动测距信标。

代码语言:javascript
复制
public class BeaconListener extends Application implements BootstrapNotifier {
private static final String TAG = "BEACON TEST";
private RegionBootstrap regionBootstrap;
private MonitoringActivity monitoringActivity = null;
private Region mRegion;
private BeaconManager beaconManager;
private String UUID;
public void onCreate() {
    super.onCreate();
    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19"));
    beaconManager.setBackgroundScanPeriod(1100);
    beaconManager.setBackgroundBetweenScanPeriod(0);
    beaconManager.setAndroidLScanningDisabled(true);

    beaconManager.setBackgroundMode(true);

    mRegion = new Region("Beacon", Identifier.parse("0xffffffffffffffffffff"), null, null);

    regionBootstrap = new RegionBootstrap(this, mRegion);

}

@Override
public void didEnterRegion(Region arg0) {
    // In this example, this class sends a notification to the user whenever a Beacon
    // matching a Region (defined above) are first seen.

    try {
        beaconManager.startRangingBeaconsInRegion(mRegion);
        beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region arg0) {
                try {
                    for (Beacon beacon : beacons) {
                          beaconManager.stopRangingBeaconsInRegion(mRegion);
                          sendNotification();
                    }
                } catch (Exception e) {
                    Log.i(TAG, e.getMessage());
                }
            }
        });

        beaconManager.startRangingBeaconsInRegion(mRegion);
        beaconManager.setBackgroundScanPeriod(1100);
        beaconManager.setBackgroundBetweenScanPeriod(0);
        beaconManager.setAndroidLScanningDisabled(true);
    } catch (RemoteException e) {    }
}

这很好,而且我可以得到探测到的信标/s的完整UUID,但是,当我关闭应用程序或将其置于后台模式时,重新启动监视服务需要几分钟(大约5分钟)。有什么方法可以立即重新启动服务后,去后台或关闭应用程序?当我将设备连接到充电器上时,它会重新启动服务,并迅速再次找到信标。

PS:当我谈到第一个ID和第二个ID时,我给出了UUID = ID1 + ID2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-23 12:20:37

在用户使用Android灯塔图书馆杀死应用程序之后,重新启动扫描需要五分钟的时间,这是正确的。无法配置此间隔,但如果适合您的用例,则可以在代码中对其进行更改。

请理解,当您使用任务切换器杀死一个应用程序时,操作系统将停止与该应用程序相关的所有进程,包括库用于扫描信标的后台服务。库使用两种不同的技术重新启动此扫描服务:

  1. 通过监听电源连接/断开连接事件。
  2. 通过使用AlarmManager重新启动,如果从上次活动到现在已经过了五分钟。

第二种方法既适用于任务切换程序被杀死的情况,也适用于由于内存不足而被操作系统杀死的情况。在后一种情况下,立即重新启动是不合适的,因为前台应用程序可能需要驱逐其他应用程序才能在一段时间内使用所有系统内存。谷歌地图( Google )的应用程序通常会在摇摄和缩放时造成这种情况。

选择五分钟间隔只是因为它是一个合理的时间间隔,期望一个低内存条件清除。

虽然5分钟的默认设置在库中是不可配置的,但由于它是开源的,如果您愿意,可以编译一个修改后的版本来将其设置为更短的时间间隔。要更改的代码是这里。然而,要明白,这可能会对急需内存的前台应用程序产生负面影响。

票数 0
EN

Stack Overflow用户

发布于 2017-03-25 07:13:41

毫不延迟地检测前景、背景、杀伤状态中的信标。

只在应用程序类中编写代码,不需要后台服务来监视信标。

我是这样做的:

代码语言:javascript
复制
/**
 * Created by Hiren Patel on 3/25/2017.
 */
public class MyApplication extends Application implements BootstrapNotifier {

    private BeaconManager iBeaconManager;
    private RegionBootstrap regionBootstrap;


    @Override
    public void onCreate() {
        super.onCreate();

        stopBeaconMonitoring();
        startBeaconMonitoring();

    }

    public void stopBeaconMonitoring() {
        Log.i("Application", "stopBeaconMonitoring");
        if (iBeaconManager != null) {
            iBeaconManager.removeAllMonitorNotifiers();
            iBeaconManager.removeAllRangeNotifiers();
            iBeaconManager = null;
        }
    }

    private void startBeaconMonitoring() {

        iBeaconManager = BeaconManager.getInstanceForApplication(this);
        iBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
        iBeaconManager.setBackgroundBetweenScanPeriod(5000l);
        iBeaconManager.setBackgroundScanPeriod(1000l);
        iBeaconManager.setDebug(true);

        //Start the Services that will keep checking for beacons in the background, even if the application is closed (swiped away from the app-switcher).
        Intent startServiceIntent = new Intent(this.getApplicationContext(), BeaconService.class);
        this.getApplicationContext().startService(startServiceIntent);
        startServiceIntent = new Intent(this.getApplicationContext(), BeaconIntentProcessor.class);
        this.getApplicationContext().startService(startServiceIntent);

        List<BeaconEntity> beaconEntityList = YourBeaconListHere;
        if (beaconEntityList != null) {
            for (BeaconEntity beaconEntity : beaconEntityList) {
                Region region = new Region(beaconEntity.Name, Identifier.parse(beaconEntity.UUID), Identifier.parse(String.valueOf(beaconEntity.Major)), Identifier.parse(String.valueOf(beaconEntity.Minor)));
                regionBootstrap = new RegionBootstrap(this, region);
                Log.i("Beacons List", beaconEntity.Name + "-" + beaconEntity.UUID + "-" + String.valueOf(beaconEntity.Major) + "-" + String.valueOf(beaconEntity.Minor));
            }
        }else{
            Log.i("Beacons List", "null");
        }
    }

    @Override
    public void didEnterRegion(Region region) {
        // You entered in Region(beacon range)
        Log.i("Application", "didEnterRegion called");
    }

    @Override
    public void didExitRegion(Region region) {
        // You exited from Region(beacon range)
        Log.i("Application", "didExitRegion called");
    }

    @Override
    public void didDetermineStateForRegion(int i, Region region) {
        // Region state changed, just ignore it
        Log.i("Application", "didDetermineStateForRegion called");
    }
}

喜欢信标.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33869616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档