Lollipop+ 解除绑定 BeaconManager 不工作
Lollipop+ Unbind BeaconManager not working
我正在尝试在我的 Android 应用程序中实现信标功能。
不幸的是,有一些奇怪的行为我还不能解决。
我正在使用版本 2.15 中的 Android Beacon Library 和 Android 6.0.1。
我有一个Activity
class MainActivity extends AppCompatActivity implements BeaconConsumer
我想在哪里搜索附近的信标。我将 BeaconManager
初始化为
private BeaconManager m_beaconManager;
[...]
m_beaconManager = BeaconManager.getInstanceForApplication(this);
m_beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_URL_LAYOUT));
m_beaconManager.bind(this);
在 onCreate()
方法中。
我搜索信标的方式
@Override
public void onBeaconServiceConnect() {
m_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
// do something
}
});
try {
m_beaconManager.startRangingBeaconsInRegion(m_region);
} catch(RemoteException e) {
e.printStackTrace();
}
}
工作得很好。
在我的应用程序中,我想在列表中显示这些信标,如果我单击其中一个,我想启动一个新的 activity,其中包含有关信标的更多信息(MAC 地址,距离等)。
我目前的做法是在 onPause()
方法中取消绑定我的 BeaconManager
,并在我的新 Activity 中创建一个全新的 BeaconManager
。这也完美无缺。
但是一旦我 finish()
我的第二个 activity 它就不会停止搜索信标。我也像这样解除绑定 BeaconManager
@Override
public void onPause() {
super.onPause();
m_beaconManager.unbind(this);
}
@Override
public void onDestroy() {
super.onDestroy();
m_beaconManager.unbind(this);
}
@Override
public void onStop() {
super.onStop();
m_beaconManager.unbind(this);
}
但在我的 MainActivity
中,我搜索了 2 次信标。一个来自我的MainActivity
,另一个来自我已经完成的第二名activity。
此外,如果我单击列表中的另一个项目,这意味着我再次创建第二个 activity,它会从第一个开始和新的开始寻找信标。列表上的每一次新点击都会在现有搜索中添加一个新搜索。
我已经搜索过已知的 Bug,但没有类似的。
我做错了什么?
为了防止重复回调,除了解绑,还应该调用(a)stopRangingBeaconsInRegion(...)
和(b)removeRangeNotifier(...)
。要删除通知程序,您需要保留对回调的引用 class.
我正在尝试在我的 Android 应用程序中实现信标功能。 不幸的是,有一些奇怪的行为我还不能解决。
我正在使用版本 2.15 中的 Android Beacon Library 和 Android 6.0.1。
我有一个Activity
class MainActivity extends AppCompatActivity implements BeaconConsumer
我想在哪里搜索附近的信标。我将 BeaconManager
初始化为
private BeaconManager m_beaconManager;
[...]
m_beaconManager = BeaconManager.getInstanceForApplication(this);
m_beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_URL_LAYOUT));
m_beaconManager.bind(this);
在 onCreate()
方法中。
我搜索信标的方式
@Override
public void onBeaconServiceConnect() {
m_beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
// do something
}
});
try {
m_beaconManager.startRangingBeaconsInRegion(m_region);
} catch(RemoteException e) {
e.printStackTrace();
}
}
工作得很好。
在我的应用程序中,我想在列表中显示这些信标,如果我单击其中一个,我想启动一个新的 activity,其中包含有关信标的更多信息(MAC 地址,距离等)。
我目前的做法是在 onPause()
方法中取消绑定我的 BeaconManager
,并在我的新 Activity 中创建一个全新的 BeaconManager
。这也完美无缺。
但是一旦我 finish()
我的第二个 activity 它就不会停止搜索信标。我也像这样解除绑定 BeaconManager
@Override
public void onPause() {
super.onPause();
m_beaconManager.unbind(this);
}
@Override
public void onDestroy() {
super.onDestroy();
m_beaconManager.unbind(this);
}
@Override
public void onStop() {
super.onStop();
m_beaconManager.unbind(this);
}
但在我的 MainActivity
中,我搜索了 2 次信标。一个来自我的MainActivity
,另一个来自我已经完成的第二名activity。
此外,如果我单击列表中的另一个项目,这意味着我再次创建第二个 activity,它会从第一个开始和新的开始寻找信标。列表上的每一次新点击都会在现有搜索中添加一个新搜索。
我已经搜索过已知的 Bug,但没有类似的。
我做错了什么?
为了防止重复回调,除了解绑,还应该调用(a)stopRangingBeaconsInRegion(...)
和(b)removeRangeNotifier(...)
。要删除通知程序,您需要保留对回调的引用 class.