将值传递给广播接收器,putExtra循环,

时间:2015-09-19 14:43:46

标签: android

简而言之:我有一个侦听短信发送收据的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): 从MyGcmListenerServiceSendSmsService

mServiceIntent .putExtra(SendSmsService.EXTRA_ID, id);

来自SendSmsService的接收者:

deliveryIntent.putExtra(EXTRA_ID, id);

但很快我意识到我只从循环中得到最后的ID。由于我猜的唯一键,putExtra()会覆盖其他ID。

我想不出这个问题的解决方案,任何帮助都会受到赞赏

1 个答案:

答案 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());
    }