2011-05-30 203 views
5

http://mobiforge.com/developing/story/sms-messaging-android從意圖獲取多個廣播?

我使用的示例代碼在上面的鏈接我自己用於發送短信的應用程序,但我檢查我的消息的發送狀態時遇到一個問題。會發生什麼,對於我嘗試發送的每封郵件,都會彈出Toast消息。所以基本上,假設我已經發送了3封郵件。當我發送第4條消息時,Toast消息將彈出4次。似乎BroadcastReceiver可能從目前使用的每一個意圖收到相同的廣播?我無法弄清楚爲什麼會發生這種情況,或者如何阻止它。任何幫助或見解將不勝感激!

這裏是導致該具體方法:

//---sends an SMS message to another device--- 
private void sendSMS(String phoneNumber, String message) 
{   
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
     new Intent(DELIVERED), 0); 

    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 

    //---when the SMS has been delivered--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS delivered", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case Activity.RESULT_CANCELED: 
        Toast.makeText(getBaseContext(), "SMS not delivered", 
          Toast.LENGTH_SHORT).show(); 
        break;       
      } 
     } 
    }, new IntentFilter(DELIVERED));   

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);   
} 
+0

您是否能夠發佈複製問題所需的完整最小代碼? – 2011-06-01 00:24:46

+0

我會編輯我原來的帖子,以包括導致​​問題 – John 2011-06-03 14:48:34

回答

9

首先,你必須每次調用sendSMS時間new BroadcastReceiver(){,所以他們堆積起來,多了一個你叫sendSMS各一次。您可以在每個BroadcastReceiver的底部添加unregister(this);,但更好的做法是將廣播接收器移出此功能。您可以創建+註冊一個在onResume()unregisteronPause().

其次,如果你想隨你pendingIntent你需要幫助的Android區分待處理的意圖更好地發送數據,讀取此link

.. 。
eg

PendingIntent deliveredPI = PendingIntent.getBroadcast(this, uniqueIdPerSMS++, 
    new Intent(DELIVERED), PendingIntent.FLAG_CANCEL_CURRENT); 
+0

謝謝,它的工作方法。 – Atmaram 2011-07-09 19:19:00

+0

你好,我面臨同樣的問題我有1廣播接收機,從我開始1服務是從收件箱中獲取消息。在那之後,我將這些消息發送到特定的號碼。對於發送的消息,我使用了與上面相同的代碼(由John發佈)。我的問題是,當我發送消息時,吐司消息「SMS SENT」將會持續發送。那麼我怎樣才能收到這一次? – anddev 2011-11-14 04:37:35

+0

作品像魅力! thanx :) – 2012-05-10 10:09:00

0

簡單,這是使用一個唯一的ID爲每個deliveredPI,因爲如果你不那麼Android的考慮都是相同的,所有短信的的deliveredPi將顯示任何一個結果(不知道如果第一或最後)。