2011-10-05 86 views
7

我需要註冊一個接收器。我一直在使用以下模式:註冊接收器的正確模式?

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

我只看過上面的第一個模式,從來沒有一個地方,你檢查的意圖響應 - 任何澄清會很好。

回答

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; 
    } 
} 
+0

這個好,謝謝,是有道理的。 – user291701

相關問題