安卓PendingIntent额外信息

11

我正在尝试从Android应用程序发送短信。我正在使用PendingIntent,以便可以使用Broadcast Receiver检查它是否已成功发送。由于sendTextMessage调用将针对每个短信执行,因此我需要发送一些“额外的”数据来标识实际的SMS,以便我的广播接收器可以对特定的SMS消息进行一些操作。

这是我的发送代码:

        String SENT = "SMS_SENT";

        Intent sentIntent = new Intent(SENT);
        sentIntent.putExtra("foo", "BAR");
        PendingIntent sentPI = PendingIntent.getBroadcast(baseContext, 0,
            sentIntent, 0);

        PendingIntent deliveredPI = PendingIntent.getBroadcast(baseContext, 0,
            new Intent(DELIVERED), 0);

        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(smsMessage.getNumber(), null, smsMessage.getText(), sentPI, deliveredPI); 

问题在于我的广播接收器无法读取我的额外信息 "foo":

    public class SMSSentBroadcastReceiver extends BroadcastReceiver {

   @Override
       public void onReceive(Context arg0, Intent intent) {
       String smsID = intent.getStringExtra("foo");
       ......
       }
    }

smsID 只会变成 null。

我的广播接收器是这样注册的:

baseContext.registerReceiver(new SMSSentBroadcastReceiver(), new IntentFilter("SMS_SENT"));

假设意图过滤器能够工作,那么我错在哪里?为什么额外信息没有被发送呢?

任何帮助都将不胜感激。谢谢。


在您的 PendingIntent.getBroadcast 中,如果传递了一些唯一的请求代码,那么 smsID 是否仍然为空?(例如:PendingIntent.getBroadcast(baseContext, 99, sentIntent, 0) - dule
太好了!那个有效。如果你把它作为答案,我会接受 :) 但是,为什么需要一个唯一的请求代码?以前,我只是将其设置为0,似乎没有用。 - jtnire
1个回答

18
我怀疑已经发生了(至少在我身上发生了)的情况是,在此之前你正在其他地方使用SMS_SENT意图,那时候,该意图中没有“foo”附加项。 使用相同的意图和请求代码调用PendingIntent.getBroadcast将返回原始待处理意图。
如果它实际上是要使用相同的意图,您需要使用类似PendingIntent.FLAG_UPDATE_CURRENT这样的标志来更新带有新扩展的意图。 如果不是想使用相同的意图,它应该具有不同的请求代码,以便它不匹配其他意图(这就是为什么输入唯一的请求代码起作用的原因)。

我非常确定foo始终被设置为额外内容。但是我可以确认,“相同”的待处理意图被调用了两次,因为有2条短信消息正在尝试发送。我认为这实际上可能是SDK中的一个错误... - jtnire
我不确定为什么额外的内容总是会出现(对我来说,有时候会出现,但是是不正确的,即过时的)。我不知道是否存在任何会导致这种情况的错误,通常我认为这是因为我缺少了某些东西而不是SDK本身有问题 :) - dule
@dule,你太棒了!这个问题折磨了我好几个小时,直到我找到了你的答案。 - neevek
是的,终于成功了,谢谢!顺便说一下,我遇到的问题是当我按下应用程序通知时想要发送额外的内容,但这与挂起意图有关。 - Igor Čordaš

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