2013-10-22 49 views
0

我有2個接收器和GCMIntentService類在我的應用程序GCM;一個在我的應用程序中,另一個包含在我已添加到我的應用程序中的庫中。當通過GCM接收到消息時;我想知道如何識別接收到的消息的意圖,並讓正確的接收者處理它。有人建議here將結果傳播到下一個接收器,如果它不適用於我的,但我無法做到這一點。如果有人能幫助我,我會很感激。傳播結果到下一個BroadcastReceiver在android

+0

我寫了這個建議。什麼不適合你?您可以使用優先級來確定首先調用哪個接收方,並且可以使用發送方ID來知道該消息是否適用於特定的接收方。 – Eran

+0

感謝您的回覆。是的,我可以確定哪一個接收器是它的目的,但我不知道如何將結果傳播給另一個接收器,如果它不適合我。 –

+0

爲了識別我的接收者的消息,我正在發送一個帶有消息的標識符字符串,並在我的GCMIntentService的onMessage()方法中檢查接收到的消息是否包含該字符串。我不確定這是否是正確的方法。你的意思是這樣嗎?如果不是,處理這個問題的正確位置是什麼。我應該定義自定義的GCMBroadcastReceiver嗎? –

回答

0

好吧,我已經設法解決它。感謝@Eran的幫助。我使用的是已棄用的GCM API。 GCMBroadcastReceiver的默認實現爲

setResult(Activity.RESULT_OK, null /* data */, null /* extra */); 

in onReceive()方法。這將阻止將結果傳遞給下一個接收器。我試圖覆蓋onReceive方法,但它是最終的,不會讓我忽略它。所以,我切換到新的Google雲端通訊API和定義的自定義廣播接收器,並在其的onReceive()梅託德我這樣做:

@Override 
    public void onReceive(Context context, Intent intent) { 

     String message = intent.getExtras().getString("identifier_tag"); 

     // ignore if message not intended for us 
     if (message == null) { 
      setResultCode(Activity.RESULT_OK); 
      return; 
     } 
     if (!message.equals(IDENTIFIER_TAG)) { 
      setResultCode(Activity.RESULT_OK); 
      return; 
     } 


     ComponentName comp = new ComponentName(context.getPackageName(), 
       GcmIntentService.class.getName()); 
     // Start the service, keeping the device awake while it is 
     // launching. 
     startWakefulService(context, (intent.setComponent(comp))); 

     // message has been handled; do not propagate 
     setResult(Activity.RESULT_OK, null, null); 

} 

我所做的就是檢查是否收到的消息的目的是爲我。如果是的話,我會調用intent服務和setResult(Activity.RESULT_OK,null,null);會阻止消息傳遞給其他接收者。如果消息不是針對我的,我會將它傳遞給下一個接收者。也在清單文件中,我將此接收器的優先級設置得更高,以確保它首先收到消息。