В эталонном приложении RegionBootstrap инициализируется в пользовательского класса приложения на это OnCreate метод и, конечно, класс приложения вызывается перед какой-либо деятельности, называется.Поздняя инициализация RegionBootstrap
Есть ли способ инициализировать RegionBootstrap внутри действия? Я уже пытался создать статическую переменную RegionBootstrap, поэтому я могу назвать ее в другом виде, но, к сожалению, она не работает.
BeaconApplication.regionBootstrap = new RegionBootstrap((BootstrapNotifier) this.getApplication(), downloadedBeacons);
В Регионы, которые я должен быть инициализирован придет от сервера, поэтому инициализация RegionBootstrap не должна исходить из класса приложения.
* EDIT *
public class LoginActivity extends ActionBarActivity {
…
/*** short version ***/
@Override
protected void onCreate(Bundle savedInstanceState) {
/*** after successful login ***/
BeaconApplication.beacons = downloadBeaconsFromServer();
}
}
public class BeaconActivity extends ActionBarActivity {
…
@Override
protected void onCreate(Bundle savedInstanceState) {
…
startService(new Intent(this, BeaconService.class));
}
}
Это где я реализовал BeaconConsumer
public class BeaconService extends Service implements BeaconConsumer {
private BeaconManager beaconManager;
private BeaconNotifier beaconNotifier;
private RegionBootstrap regionBootstrap;
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate");
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.setBackgroundBetweenScanPeriod(1001);
beaconManager.setBackgroundScanPeriod(101);
beaconManager.setForegroundScanPeriod(101);
beaconManager.setForegroundBetweenScanPeriod(1001);
beaconNotifier = new BeaconNotifier(this);
beaconManager.bind(this);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.setMonitorNotifier(beaconNotifier);
monitorBeacons();
regionBootstrap = new RegionBootstrap(beaconNotifier, BeaconApplication.beacons);
}
private void monitorBeacons() {
for (Region beacon : BeaconApplication.beacons) {
try {
Log.i(TAG, "Monitoring beacon " + beacon.getUniqueId());
beaconManager.startMonitoringBeaconsInRegion(beacon);
} catch (RemoteException e) {
Log.e(TAG, "Monitoring beacon failed");
e.printStackTrace();
}
}
}
}
Реализация BeaconNotifier
public class BeaconNotifier implements BootstrapNotifier {
private Context context;
public BeaconNotifier(Context context) {
this.context = context;
}
@Override
didEnter.. etc
@Override
public Context getApplicationContext() {
return context;
}
}
Будут ли эти методы открывать приложение из фона и контролировать маяки даже после того, как андроид убивает приложение, как указано здесь? http: //altbeacon.github.io/android-beacon-library/resume-after-terminate.html – user158335
Я обновил свой ответ, пожалуйста, проверьте его и сообщите мне, если он сработает для вас. –
РегионBootstrap нуждается в двух аргументах, а не только в Регионе, как указано в моем вопросе. Я попробовал этот 'RegionBootstrap dummy = новый RegionBootstrap ((BootstrapNotifier) getApplicationContext(), новый Region (" dummy ", null, null, null)) ;, но я получил эту ошибку _java.lang.ClassCastException: com.tektosworld.ibeaconmobileapp. BeaconApplication не может быть передан в org.altbeacon.beacon.startup.BootstrapNotifier_. Это та самая ошибка, с которой я столкнулся, когда я не ставил BootstrapNotifier внутри класса Application. – user158335