简而言之:我有一个侦听短信发送收据的BroadcastReceiver。调用onReceive,但是如何识别收据的SMS? 在Intent中放置值不起作用,因为如果我同时发送三条SMS,我将每次都有最后一条SMS标识符(putExtra()似乎用相同的键覆盖值)
详细信息:
我有一个监听GCM推送通知的类(MyGcmListenerService
)。一种方法将解析来自服务器的JSON数据;数据包括ID,文本消息和数字的数组,例如:
{ “文本”:[{ “ID”: “11”, “号码”: “0494587693”, “文本”: “你好”},{ “ID”: “12”, “号码”:“0494635478 ”, “文”: “世界”},{ “ID”: “13”, “号码”: “0487533693”, “文”: “富”}]}
对于每条短信,该方法将启动将发送SMS的IntentService(SendSmsService
)。请参阅以下代码:
JSONObject object = new JSONObject(stringResponse);
JSONArray texts = object.getJSONArray("texts");
for (int i = 0; i < texts.length(); ++i) {
JSONObject jsonObject = texts.getJSONObject(i);
int id = jsonObject.getInt("id");
String number = jsonObject.getString("number");
String text = jsonObject.getString("text");
Intent mServiceIntent = new Intent(this, SendSmsService.class);
startService(mServiceIntent);
}
在SendSmsService
发送短信的代码:
Intent sentIntent = new Intent("com.example.smsgateway.SMS_SENT");
PendingIntent sentPendingIntent = PendingIntent.getBroadcast(
getApplicationContext(), 0, sentIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Intent deliveryIntent = new Intent("com.example.smsgateway.SMS_DELIVERED");
PendingIntent deliverPendingIntent = PendingIntent.getBroadcast(
getApplicationContext(), 0, deliveryIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(number, null, message, sentPendingIntent, deliverPendingIntent);
问题是我有一个类来监听送货回执,而且该类需要识别送货回执所涉及的id(来自上面的json字符串)。
public class SmsDeliveredReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "SMS delivered"); // OK, but which one??
我试图在Intent对象中传递ID(putExtra):
从MyGcmListenerService
到SendSmsService
:
mServiceIntent .putExtra(SendSmsService.EXTRA_ID, id);
来自SendSmsService
的接收者:
deliveryIntent.putExtra(EXTRA_ID, id);
但很快我意识到我只从循环中得到最后的ID。由于我猜的唯一键,putExtra()会覆盖其他ID。
我想不出这个问题的解决方案,任何帮助都会受到赞赏
答案 0 :(得分:0)
你需要一个请求代码,你在getBroadcast上看到我添加了RowId.intValue()这是因为我想收到那个唯一的请求。这样他们就不会被覆盖。这样可以防止错过循环中的相同值。
也注意到PendingIntent.FLAG_ONE_SHOT这意味着。广播将通知一次。这可以防止意外的重复循环。
String SENT = "SMS_SENT";
Intent intentSent = new Intent(SENT);
intentSent.putExtra("RowId", RowId);
PendingIntent sentPI = PendingIntent.getBroadcast(this, RowId.intValue(), intentSent, PendingIntent.FLAG_ONE_SHOT);
String DELIVERED = "SMS_DELIVERED";
Intent intentDelivered = new Intent(DELIVERED);
intentDelivered.putExtra("RowId", RowId);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, RowId.intValue(), intentDelivered, PendingIntent.FLAG_ONE_SHOT);
try {
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); //deliveredPI
} catch (IllegalArgumentException e) {
Log.e(TAG, "Exception " + e.getMessage());
}