我需要注册一个接收者。我一直在使用以下模式:
@Override
protected void onResume() {
super.onResume();
registerReceiver(myReceiver, new IntentFilter(...));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(myReceiver);
}
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
...
});
我从市场收到有关我的 unregisterReceiver() 调用的崩溃报告:
java.lang.IllegalArgumentException: Receiver not registered
我认为这是不可能的,但似乎这是正确的模式:
private Intent mIntent;
@Override
protected void onResume() {
super.onResume();
if (mIntent == null) {
mIntent = registerReceiver(myReceiver, new IntentFilter(...));
}
}
@Override
protected void onPause() {
super.onPause();
if (mIntent != null) {
unregisterReceiver(myReceiver);
mIntent = null;
}
}
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
...
});
以上是正确的模式吗?我猜注册可能会失败,我们必须保留 registerReceiver() 的结果,并在调用 unregister() 之前在 onPause() 中检查它?
Thanks
我的改变基于这个问题:BroadcastReceiver 问题(接收器未注册错误) https://stackoverflow.com/questions/5036451/problem-with-broadcastreceiver-receiver-not-registered-error
我只见过上面的第一个模式,从未见过检查意图响应的模式 - 任何澄清都会很棒。
以上是正确的模式吗?
不,这不一定有效。从文档中registerReceiver(...)
...
Returns找到的第一个粘性意图与过滤器匹配,如果没有则为 null。
换句话说,即使注册接收器的调用成功,如果该意图过滤器没有粘性广播,它仍然可能返回 null。
我的方法是简单地使用布尔值和 try/catch 块......
private boolean isReceiverRegistered;
@Override
protected void onResume() {
super.onResume();
if (!isReceiverRegistered) {
registerReceiver(myReceiver, new IntentFilter(...));
isReceiverRegistered = true;
}
}
@Override
protected void onPause() {
super.onPause();
if (isReceiverRegistered) {
try {
unregisterReceiver(myReceiver);
} catch (IllegalArgumentException e) {
// Do nothing
}
isReceiverRegistered = false;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)