2011-05-30 224 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将显示任何一个结果(不知道如果第一或最后)。