注册接收器的正确模式?

时间:2011-10-05 17:32:10

标签: android

我需要注册一个接收器。我一直在使用以下模式:

@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)

我只见过上面的第一个模式,从来没有看到你检查意图反应的地方 - 任何澄清都会很棒。

1 个答案:

答案 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;
    }
}