Android AltBeacon Hintergrund-Service Bis Hin
Arbeite ich an einer bluetooth-app mit der AltBeacon Bibliothek. Es scheint, dass nur auf die Instanz des BeaconManager
ist pro Anwendung zulässig. Das problem, das ich bin vor ist dieses: ich will einen ständig im hintergrund Laufenden Dienst, der ständig macht bluetooth gefächert und sendet Benachrichtigungen. Wenn ich meinen app (bring es in den Vordergrund zu stellen) ich war der service zum anhalten reichen. Die Vordergrund-Aktivität werden dann reichen, und zeigen Sie die Inhalte auf dem Bildschirm.
Das problem ist, dass die beacons-manager (aus BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
) in der Aktivität und der service ist der gleiche Instanz. Also, wenn die activity geschlossen wird, beaconManager.unbind(this);
aufgerufen wird, und der Bereich notifier im service nicht mehr feuert.
Ist es möglich, zwei separate Instanzen der beacon-manager? Wenn nicht, wie kann ich tun, bis hin zu einem kontinuierlichen Betrieb-service und eine Aktivität?
RangingActivity
@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);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein Fall, wo eine benutzerdefinierte
android.app.Application
Klasse ist sehr nützlich. DieBeaconManager
ist ein singleton, so dass nur eine darf zur gleichen Zeit existieren. Ebenso dieApplication
Klasse hat eine einzige Instanz pro-aktive Android-Anwendung. Wenn Sie wollen, um beacon-Erkennung in einemActivity
und einService
gleichzeitig nutzen Sie die zentraleApplication
- Klasse, um die Bindung zuBeaconManager
und anschließend weiterleiten, Rückrufe, um sowohl IhreActivity
und IhreService
.Sehen Sie ein Beispiel der Bindung an die
BeaconManager
in einemApplication
Klasse und dann vorbei Rückrufe zu einemActivity
in der Referenz-Anwendung hier: https://github.com/AltBeacon/android-beacon-library-reference/blob/master/app/src/main/java/org/altbeacon/beaconreference/BeaconReferenceApplication.javabeaconManager.setBackgroundBetweenScanPeriod(60000l)
erzählt die Bibliothek zu pausieren fir 60 Sekunden zwischen den einzelnen hintergrund-scan statt 5 Minuten.beaconManager.updateScanPeriods();
bestätigen Sie Ihre änderungen an der scan-service, wenn Sie änderungen vornehmen, nachdem es bereits begonnen hat. Wenn Sie die änderungen sofort nach dem ersten immer einen Verweis auf dieBeaconManager
bei app-start-up, brauchen Sie nicht, dies zu tun.Sollten Sie verlängern die Einsatz-Klasse und start-region hintergrund monitoring-wie wird es erklärt, hier (siehe "Starten einer App im Hintergrund").
Damit zu tun, die reichen, die in der gleichen Klasse implementieren RangeNotifier:
Starten, die bis hin in didEnterRegion:
Implementieren didRangeBeaconsInRegion Methode: