首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓AltBeacon背景服务测距

安卓AltBeacon背景服务测距
EN

Stack Overflow用户
提问于 2014-10-28 13:24:33
回答 2查看 8.7K关注 0票数 7

我正在使用AltBeacon库开发一个蓝牙应用程序。似乎每个应用程序只允许在BeaconManager的实例上使用。我面临的问题是:我想要一个持续运行的后台服务,它不断地进行蓝牙测距并发送通知。如果我打开我的应用程序(把它带到前台),我就是暂停测距的服务。前台活动将进行测距,并在屏幕上显示内容。

问题是活动和服务中的信标管理器(来自BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);)是同一个实例。因此,当活动被关闭时,beaconManager.unbind(this);被调用,服务中的范围通知器不再触发。

有可能得到两个独立的信标管理器实例吗?如果没有,我如何在连续运行的服务和活动中进行测距?

RangingActivity

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
...
regionEstimote = new Region("estimote", null, null, null);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.bind(this);
}
@Override
protected void onDestroy() {
    super.onDestroy();
    notificationManager.cancel(NOTIFICATION_ID);
    //beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
    beaconManager.setRangeNotifier(new RangeNotifier() {
        ....
    });
    try {
        beaconManager.startRangingBeaconsInRegion(regionEstimote);
    } catch (RemoteException e) {
        Log.e(TAG, "RangingActivity", e);
    }
}

BeaconService.java

代码语言:javascript
复制
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if(beaconHistory == null)
        beaconHistory = new HashMap<Integer, Date>();

    mBeaconManager = BeaconManager.getInstanceForApplication(this);
    mBeaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    beaconHistory = null;
    mBeaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
    mBeaconManager.setRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            if(ActivityBase.isActivityVisible()) {   //don't do ranging logic if any activity from my app is in the foreground
                return;
            }
            ...
        }
    });

    try {
        mBeaconManager.startRangingBeaconsInRegion(regionMint);
    } catch (RemoteException e) {
        Log.e(TAG, "BeaconService", e);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-28 14:14:38

在这种情况下,自定义android.app.Application类非常有用。BeaconManager是一个单例,因此只允许同时存在一个。类似地,Application类每个活动的Android应用程序都有一个实例。如果希望同时在ActivityService中进行信标检测,请使用集中式Application类来绑定到BeaconManager,然后将回调转发到ActivityService

您可以看到一个在BeaconManager类中绑定到Application的示例,然后在这里向引用应用程序中的Activity传递回调:https://github.com/AltBeacon/android-beacon-library-reference/blob/master/app/src/main/java/org/altbeacon/beaconreference/BeaconReferenceApplication.java

票数 6
EN

Stack Overflow用户

发布于 2015-12-17 06:03:08

您应该像解释这里那样扩展应用程序类和启动区域背景监视(请参见“在后台启动应用程序”)。

为了完成测距,在同一个类中实现RangeNotifier:

代码语言:javascript
复制
public class AndroidApp extends Application implements BootstrapNotifier, RangeNotifier {...

启动didEnterRegion中的测距:

代码语言:javascript
复制
@Override
public void didEnterRegion(Region region) {
    try {
        mBeaconManager.startRangingBeaconsInRegion(region);
    }
    catch (RemoteException e) {
        if (BuildConfig.DEBUG) Log.d(Const.TAG, "Can't start ranging");
    }
}
  1. 实现didRangeBeaconsInRegion方法: @覆盖公共无效didRangeBeaconsInRegion(集合信标,区域区域){ if (beacons.size() > 0) { Beacon = beacons.iterator().next();if (BuildConfig.DEBUG) Log.d(Const.TAG,"Beacon : UUID:“+ firstBeacon.getId1().toString() +”大调:“+ firstBeacon.getId2().toString() +小调:+ firstBeacon.getId3().toString());//处理结果//停止测距尝试{ mBeaconManager.stopRangingBeaconsInRegion(region);} catch (RemoteException e) { e.printStackTrace();}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26609519

复制
相关文章

相似问题

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