RegionBootstrap 的后期初始化
Late initialisation of RegionBootstrap
在参考应用程序中,RegionBootstrap 在 自定义应用程序 class 的 onCreate 方法 中初始化,当然,在调用任何 activity 之前调用应用程序 class。
有没有办法在 activity 中初始化 RegionBootstrap?我已经尝试制作 RegionBootstrap 的静态变量,以便我可以在不同的 activity 中调用它,但不幸的是,它不起作用。
BeaconApplication.regionBootstrap = new RegionBootstrap((BootstrapNotifier) this.getApplication(), downloadedBeacons);
我需要初始化的 Regions 会来自服务器,所以 RegionBootstrap 的初始化不能来自应用程序 class.
* 编辑 *
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;
}
}
您可以使用:
BeaconManager.setMonitorNotifier(MonitorNotifier);
BeaconManager.startMonitoringBeaconsInRegion(Region);
但是不要忘记,为了使用BeaconManager
方法,你必须等到BeaconService
连接上。请注意,使用此方法,如果您想要在应用程序被杀死的情况下监控信标,则需要创建自己的服务。
顺便说一句,我记得有一次我也遇到过 RegionBootstrap
的问题。我用了一个技巧来处理这个问题。你能测试下面的代码吗?
...
BeaconManager.bind(yourConsumer);
...
//wait until BeaconConsumer.onBeaconServiceConnect() is called
//write following code inside of onBeaconServiceConnect
RegionBootstrap dummy = new RegionBootstrap(mBootstrapNotifier, new Region("dummy", null, null, null));
dummy.disable();
//after this point you can create your own RegionBootstrap
这里有一个关键点,你需要自己创建BootstrapNotifier
。如果你在 activity 中这样做,你可以这样做:
public class YourActivity extends Activity implements BootstrapNotifier {
...
BootstrapNotifier mBootstrapNotifier = this;
...
或 Application
class:
public class YourApp extends Application implements BootstrapNotifier {
...
BootstrapNotifier mBootstrapNotifier = this;
...
在我的例子中,我创建了一个适配器,该适配器在其构造函数中需要 Context
,并且我将该适配器用作 BootstrapNotifier
:
public class AltBeaconAdapter implements BootstrapNotifier {
private Context mContext;
...
public AltBeaconAdapter(Context context) {
mContext = context;
...
}
@Override
public Context getApplicationContext() {
return mContext;
}
...
}
此外,您必须实施 MonitorNotifier
方法,因为 BootstrapNotifier
是 MonitorNotifier
的子 class。
是的,这个技巧很奇怪,它显示库中有一个初始化错误 RegionBootstrap
但我有服务所以我切换到我向你建议的第一种方法。如果这个技巧对你也有效,请告诉我,以便我可以在图书馆的 GitHub 页面上创建问题。
在参考应用程序中,RegionBootstrap 在 自定义应用程序 class 的 onCreate 方法 中初始化,当然,在调用任何 activity 之前调用应用程序 class。
有没有办法在 activity 中初始化 RegionBootstrap?我已经尝试制作 RegionBootstrap 的静态变量,以便我可以在不同的 activity 中调用它,但不幸的是,它不起作用。
BeaconApplication.regionBootstrap = new RegionBootstrap((BootstrapNotifier) this.getApplication(), downloadedBeacons);
我需要初始化的 Regions 会来自服务器,所以 RegionBootstrap 的初始化不能来自应用程序 class.
* 编辑 *
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;
}
}
您可以使用:
BeaconManager.setMonitorNotifier(MonitorNotifier);
BeaconManager.startMonitoringBeaconsInRegion(Region);
但是不要忘记,为了使用BeaconManager
方法,你必须等到BeaconService
连接上。请注意,使用此方法,如果您想要在应用程序被杀死的情况下监控信标,则需要创建自己的服务。
顺便说一句,我记得有一次我也遇到过 RegionBootstrap
的问题。我用了一个技巧来处理这个问题。你能测试下面的代码吗?
...
BeaconManager.bind(yourConsumer);
...
//wait until BeaconConsumer.onBeaconServiceConnect() is called
//write following code inside of onBeaconServiceConnect
RegionBootstrap dummy = new RegionBootstrap(mBootstrapNotifier, new Region("dummy", null, null, null));
dummy.disable();
//after this point you can create your own RegionBootstrap
这里有一个关键点,你需要自己创建BootstrapNotifier
。如果你在 activity 中这样做,你可以这样做:
public class YourActivity extends Activity implements BootstrapNotifier {
...
BootstrapNotifier mBootstrapNotifier = this;
...
或 Application
class:
public class YourApp extends Application implements BootstrapNotifier {
...
BootstrapNotifier mBootstrapNotifier = this;
...
在我的例子中,我创建了一个适配器,该适配器在其构造函数中需要 Context
,并且我将该适配器用作 BootstrapNotifier
:
public class AltBeaconAdapter implements BootstrapNotifier {
private Context mContext;
...
public AltBeaconAdapter(Context context) {
mContext = context;
...
}
@Override
public Context getApplicationContext() {
return mContext;
}
...
}
此外,您必须实施 MonitorNotifier
方法,因为 BootstrapNotifier
是 MonitorNotifier
的子 class。
是的,这个技巧很奇怪,它显示库中有一个初始化错误 RegionBootstrap
但我有服务所以我切换到我向你建议的第一种方法。如果这个技巧对你也有效,请告诉我,以便我可以在图书馆的 GitHub 页面上创建问题。