我需要注册一个接收器。我一直在使用以下模式:
@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()中检查它?
由于
我基于这个问题的改变: Problem with BroadcastReceiver (Receiver not registered error)
我只见过上面的第一个模式,从来没有看到你检查意图反应的地方 - 任何澄清都会很棒。
答案 0 :(得分:5)
以上是正确的模式吗?
不,这不一定能奏效。来自registerReceiver(...)
的文档...
返回找到匹配过滤器的第一个粘性意图,如果没有则返回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;
}
}