我想给多个人发短信,验证短信是否发送,我查看了多个链接(这里提到的),产生了使用PendingIntent
和broadCast Receiver
进行确认的想法。
Practical way to find out if SMS has been sent
Sending text messages programmatically in android
http://mobiforge.com/design-development/sms-messaging-android
但关键问题是,我有不同的50个联系人号码在一个arrayList
和他们的不同msgs在另一个arrayList
。
我使用这个代码:
for (Condition) {
sms = SmsManager.getDefault();
try {
. . . sms.sendTextMessage(phoneNumbers[i], null, messages[i], sentPI, deliveredPI);
}
catch(IllegalArgumentException e) { }
}
现在,我无法确定有多少人收到了他们的消息,有多少人没有,因为正如帖子所示(上面提到的链接),每次我们只收到一条消息,"短信已送达"。
所以请告诉我,当我发送消息并从broadcast Receiver
获得额外信息以获得特定联系人/人的详细信息时,我如何才能在Intent
中放置"额外信息"。
- 还有一件事**:
PendingIntent
中有四个不同的标志值选项(FLAG_ONE_SHOT
、FLAG_NO_CREATE
、FLAG_CANCEL_CURRENT
、FLAG_UPDATE_CURRENT
)。当我在for循环中发送消息时,应该使用哪个选项才能获得正确的结果?
- 还有一件事**:
1条答案
按热度按时间vc6uscn91#
这是一个非常简单的示例,演示了可用于所有
SmsManager#send*()
方法的send和deliveryPendingIntent
的使用,并将数据附加到这些方法以轻松区分Receiver中的结果。附加这些数据就像在
Intent
上放置额外的东西来支持我们传递给send*()
方法的PendingIntent
一样简单。问题是PendingIntent
可能不会像预期的那样工作。系统将仅在其必须时创建新的。如果Intent
与Intent#filterEquals()
方法不同、请求代码当前未用于相等的Intent
或传递了适当的标志,则get*()
方法将仅返回不同的PendingIntent
。在具有相同请求代码的相同
Intent
上的不同extra * 不会 * 导致创建新的PendingIntent
。根据在这种情况下传递的标志,这些extra可能会被忽略,或者覆盖当前活动PendingIntent
中的extra,这可能会导致不正确的结果。在我们的示例中,我们基本上为每次发送使用相同的
Intent
,因此我们将通过传递唯一的请求代码来确保每次发送都使用不同的PendingIntent
。这个简单的示例为这些代码使用收缩列表的大小,该大小在单次运行的上下文中是唯一的。请求代码最终可以是任意的int
。只要你知道在你要求的时候它还没有被使用。如果我们在不久的将来再次需要这些
PendingIntent
,系统将需要缓存它们,因此我们还将传递FLAG_ONE_SHOT
以在使用后"清除它们",并确保在后续运行中获得正确的当前额外内容。translateSentResult()
方法修改自AOSP旧的默认SMS应用程序中的类似方法。许可证为the Apache License, Version 2.0。*注:
Intent
上的PDU extra获取的SmsMessage
的getStatus()
返回,以获取实际结果。PendingIntent
s将永远不会触发。不要依赖交货结果。Activity
的生命周期绑定在一起。理想情况下,您希望实现一个静态接收器类,在清单中注册,并使用显式Intent
将其作为目标。还建议使用Service
来处理结果。并且那些结果可以通过任何数量的机制被递送到UI;例如LocalBroadcastManager
、另一事件总线实现、Intent
S、Notification
S等。