我需要注册一个接收器.我一直在使用以下模式:
@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)
我只见过上面的第一个模式,从来没有看到你检查意图反应的地方 – 任何澄清都会很棒.
解决方法
Is the above the correct pattern?
不,这不一定能奏效.来自registerReceiver(…)的文档……
Returns The first sticky intent found that matches filter,or null if there are none.
换句话说,即使注册接收器的调用成功,如果该意图过滤器没有粘性广播,它仍然可以返回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; } }