从意图中获取多个广播?

6

http://mobiforge.com/developing/story/sms-messaging-android

我在上面链接中使用的示例代码用于发送短信的应用程序,但在检查消息发送状态时遇到了问题。发生的情况是,每个我尝试发送的消息都会弹出 toast 消息。所以基本上,假设我已经发送了 3 条消息。当我要发送第四条消息时,toast 消息将弹出 4 次。看起来可能是 BroadcastReceiver 从迄今为止使用的每个 intent 接收到相同的广播?我无法确定为什么会发生这种情况,或者如何停止它。任何帮助或见解都将不胜感激!
以下是导致此问题的具体方法:
 //---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);        
}

你能否发布完整的最小代码以复制问题? - Programmer Bruce
我会编辑我的原始帖子,包括导致问题的方法。 - John
2个回答

8
首先,每次调用sendSMS时,您都会有一个新的BroadcastReceiver(){,因此它们会不断增加,每次调用sendSMS时增加一个。您可以在每个BroadcastReceiver的底部添加unregister(this);,但更好的方法是将Broadcast接收器移出此函数。您可以在onResume()onPause()创建+注册一个,并在onPause()中取消注册。
其次,如果您想要在pendingIntent中发送数据,则需要帮助Android更好地区分您的待处理意图...例如,请阅读这个链接
 PendingIntent deliveredPI = PendingIntent.getBroadcast(this, uniqueIdPerSMS++,
    new Intent(DELIVERED), PendingIntent.FLAG_CANCEL_CURRENT);

你好,我遇到了同样的问题。我有一个广播接收器,从中启动了一个服务,该服务用于获取收件箱中的消息。然后,从该服务中,我将这些消息发送到特定的号码。对于发送消息,我使用了与上面(由John发布)相同的代码。我的问题是,当我发送消息时,Toast消息“SMS SENT”会不断出现。那么,我该如何只接收一次呢? - anddev
你好,我使用的代码几乎相同,但问题在于我想收到每条发送/传送短信的更新。为了区分,我将一些数据添加到Intent中(即发送短信的号码),但是在接收到广播时,我只收到了相同的数据(即最初添加的号码)。任何帮助都将不胜感激。谢谢 :) - ManishNegi

0
简单来说,为每个已发送的PI使用唯一的ID,因为如果不这样做,Android会将它们视为相同的,并且对于所有短信,已传递的PI都将显示任何一个的结果(不知道是第一个还是最后一个)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接