我在输入的区域显示我的应用时遇到问题,我按照示例here进行了操作。
当我将BeaconManager bind
发送到我的Activty时,它可以工作,但是当我这样做时,我从活动中获取日志而不是来自应用程序,并且应用程序不会显示,尽管它已经显示了#39 ; s不可见。
所以问题是,我可以使用类extends Application implements BootstrapNotifier
在后台启动应用程序,使用类extends AppCompatActivity implements BeaconConsumer
来处理监视/测距,还是需要处理应用程序类中的所有内容,因为绑定它在活动中未通过后台启动?
(对不好的代码块,我只是无法正确处理这个stackoverflow代码)
public class BeaconActivity extends AppCompatActivity implements BeaconConsumer {
protected final String TAG = "BeaconActivity";
private BeaconManager beaconManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate()");
setContentView(R.layout.activity_beacon);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
RangedBeacon.setSampleExpirationMilliseconds(8000);
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "Unbind Beaconmanager");
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.setMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(final Region region) {
Log.d(TAG, "Enter Region identifier: " + region.getId1() + ", " + region.getId2() + ", " + region.getId3());
}
@Override
public void didExitRegion(final Region region) {
Log.d(TAG, "Exit Region identifier: " + region.getId1() + ", " + region.getId2() + ", " + region.getId3());
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
}
});
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (final Beacon beacon : beacons) {
final String distance = new DecimalFormat("##.######").format(beacon.getDistance());
Log.d(TAG, "Distance: " + distance + ". This beacon has identifiers:" + beacon.getId1() + ", " + beacon.getId2() + ", " + beacon.getId3());
}
}
});
try {
Region region = new Region("all", null, null, null);
beaconManager.startMonitoringBeaconsInRegion(all);
beaconManager.startRangingBeaconsInRegion(all);
} catch (RemoteException e) {
}
}
}
public class BeaconApplication extends Application implements BootstrapNotifier {
private static final String TAG = "BeaconApplication";
private RegionBootstrap regionBootstrap;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "App started up");
BeaconManager 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,d:25-25"));
Region all = new Region("all", null, null, null);
regionBootstrap = new RegionBootstrap(this, all);
}
@Override
public void didEnterRegion(Region region) {
Log.d(TAG, "Enter region " + region.getUniqueId());
// regionBootstrap.disable();
Intent intent = new Intent(this, BeaconActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
}
@Override
public void didExitRegion(Region region) {
Log.d(TAG, "Exit region " + region.getUniqueId());
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
}
}
修改 我想我可能只是搞砸了一下。解释here应用程序仅在被杀时启动(不再在任务切换器中)。如果它在任务切换器中可用,它只会在后台处理传入的事件,这就是我获取活动日志的原因。
答案 0 :(得分:0)
问题是您的应用只能拥有一个 monitorNotifier
。 RegionBootstrap
类在内部设置一个,并使用它来获取Application
类的回调。
上面显示的代码更改了此处的monitorNotifier
:
public void onBeaconServiceConnect() {
beaconManager.setMonitorNotifier(new MonitorNotifier() {
...
执行该行之后,RegionBootstrap
将不再获得进入/退出事件的回调,Application
类也不会。问题不在于bind()
来电,而是setMonitorNotifier
来电。
该库不允许多个monitorNotifiers
,因此如果您想继续使用RegionBootstrap
,则必须重构代码,以便获取Application类中的所有进入/退出事件,以某种方式将它们传递给你的Activity
。