Я работаю над приложением Bluetooth, используя библиотеку AltBeacon. Кажется, что для каждого приложения разрешен только экземпляр BeaconManager
. Проблема, с которой я столкнулся, заключается в следующем: мне нужна постоянно работающая фоновая служба, которая постоянно выполняет поиск по Bluetooth и отправляет уведомления. Если я открываю свое приложение (выношу его на передний план), я должен был приостановить ранжирование. Затем действие переднего плана выполнит ранжирование и отобразит контент на экране.
Проблема в том, что менеджер маяков (из BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
) в действии и сервисе - это один и тот же экземпляр. Поэтому, когда действие закрывается, вызывается beaconManager.unbind(this);
, и средство уведомления о диапазоне в службе больше не срабатывает.
Можно ли получить два отдельных экземпляра beacon manager? Если нет, как мне выполнить ранжирование в непрерывно работающей службе и деятельности?
Ранжирование
@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
@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);
}
}