我目前正在尝试获取每封已发送短信的确认信息.我需要确保我的短信发送,所以我使用broadCastReceived来获取信息:
Intent sentIntent = new Intent(SMS_SEND);
sentIntent.putExtra("key", idSms);
PendingIntent sentPI = PendingIntent.getbroadcast(getApplicationContext(), 0, sentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
SmsManager manager = SmsManager.getDefault();
try{
manager.sendTextMessage(exp, null, sms, sentPI, null);
put("sending " + sms); //Just a method to print in a textview use has a console
} catch (IllegalArgumentException e){
put("Exception " + e.getMessage());
}
并使用这样的广播接收器
public void onReceive(Context context, Intent intent){
String idsms = intent.getExtras().getString("key");
switch (getResultCode()) {
case Activity.RESULT_OK:
put("ACK : #" + idsms);
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
case SmsManager.RESULT_ERROR_RAdio_OFF:
case SmsManager.RESULT_ERROR_NULL_PDU:
case SmsManager.RESULT_ERROR_NO_SERVICE:
put("BOOM " + getResultCode() + "\n\tfrom sms #" + idsms);
break;
}
}
这个工作就像一个魅力,直到我尝试同时发送多条消息,额外的接收始终是从最后一次短信发送,所以我无法识别哪些文本发送,哪些不发送.
这是一个简单的例子,说明会发生什么.
当我使用循环发送3sms时:
id : 1, message : SMS 1
id : 2, message : SMS 2
id : 3, message : SMS 3
收到的将获得:
ACK : #3
ACK : #3
ACK : #3
我知道这来自PendingIntent.FLAG_UPDATE_CURRENT,但我找不到解决方案.任何人都可以向我解释如何使用PendingIntent.getbroadcast(..)来管理这个或者至少让我走上正轨.
解决方法:
您的问题是由于PendingIntents可以被系统重用,如果有关请求的某些事情没有不同.在您的代码中,您传递的是FLAG_UPDATE_CURRENT,这会导致每次请求PendingIntent时更新存储的Intent及其附加内容.这就是为什么你得到每个消息的id:3.要纠正这个问题,您可以每次使用唯一的请求代码(第二个参数)调用getbroadcast(),这将为每个请求创建一个新的PendingIntent,每个请求都有一个单独的Intent及其自己的附加功能.
在您的情况下,修复应该很简单,假设每个消息的idSms是唯一的.
PendingIntent sentPI = PendingIntent.getbroadcast(getApplicationContext(),
Integer.parseInt(idSms),
sentIntent,
PendingIntent.FLAG_UPDATE_CURRENT);