我正在使用AltBeacon库处理蓝牙应用程序.似乎每个应用程序只允许使用BeaconManager实例.我面临的问题是:我想要一个持续运行的后台服务,不断进行蓝牙测距并发送通知.如果我打开我的应用程序(将它带到前台)我就是暂停范围的服务.然后,前景活动将进行测距并在屏幕上显示内容.
问题是,活动和服务中的信标管理器(来自BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);)是同一个实例.所以当活动关闭时,beaconManager.unbind(this);被调用,服务中的范围通知程序不再触发.
是否有可能获得两个独立的信标管理器实例?如果没有,我如何在连续运行的服务和活动中进行测距?
RangingActivity
@Override protected void onCreate(Bundle savedInstanceState) { ... regionEstimote = new Region("estimote",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
@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,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); } }
解决方法
这是自定义android.app.Application类非常有用的情况. BeaconManager是一个单例,因此只允许一个同时存在.同样,Application类每个活动的Android应用程序都有一个实例.如果要同时在Activity和Service中进行信标检测,请使用集中式Application类对BeaconManager进行绑定,然后将回调转发给Activity和Service.
您可以在Application类中看到绑定到BeaconManager的示例,然后将回调传递给参考应用程序中的Activity:https://github.com/AltBeacon/android-beacon-library-reference/blob/master/app/src/main/java/org/altbeacon/beaconreference/BeaconReferenceApplication.java