Android-短信发送意向未100%收到

Android-短信发送意向未100%收到,android,android-intent,broadcastreceiver,sms,android-pendingintent,Android,Android Intent,Broadcastreceiver,Sms,Android Pendingintent,我每天发送400多条短信,但只有大约95%的短信是通过广播接收器发送的。消息以5秒的间隔发送 ArrayList<String> partsArray = SmsManager.getDefault().divideMessage(this.message); ArrayList<PendingIntent> sentPendingIntents = new ArrayList<>(partsArray.size()); ArrayList<Pendin

我每天发送400多条短信,但只有大约95%的短信是通过广播接收器发送的。消息以5秒的间隔发送

ArrayList<String> partsArray = SmsManager.getDefault().divideMessage(this.message);
ArrayList<PendingIntent> sentPendingIntents = new ArrayList<>(partsArray.size());
ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<>(partsArray.size());
      .....

for (int i = 0; i < partsArray.size(); i++) {
        sentIntent = new Intent("SMS_SENT_2");
        deliveredIntent = new Intent(C.SMS_DELIVERED);
        sentPI = PendingIntent.getBroadcast(context, 0,sentIntent, PendingIntent.FLAG_ONE_SHOT);
        deliveredPI = PendingIntent.getBroadcast(context, 0, deliveredIntent, PendingIntent.FLAG_ONE_SHOT);

        sentPendingIntents.add(sentPI);
        deliveredPendingIntents.add(deliveredPI);
}

SmsManager sms = SmsManager.getDefault();
sms.sendMultipartTextMessage(phoneNumber, null,partsArray, sentPendingIntents, deliveredPendingIntents);
ArrayList partsArray=smsmsmanager.getDefault().divideMessage(this.message);
ArrayList SentPendingEvents=新的ArrayList(partsArray.size());
ArrayList DeliveredPendingEvents=新的ArrayList(partsArray.size());
.....
对于(int i=0;i
以及舱单中的广播接收器:

<receiver android:name="._broadcastReceivers.SMSSentBroadcastReceiver">
        <intent-filter android:priority="999">
            <action android:name="SMS_SENT_2" />
        </intent-filter>
</receiver>

我知道一个事实,对于一些消息,广播接收器没有得到的意图,但短信实际上是发送的


如何可靠地确定短信息是否“离开了手机”

而不是使用
标记一次
您应该确保
挂起内容是唯一的。最简单的方法是使用显式
Intent
而不是隐式
Intent
,并确保每个
Intent
中的操作是唯一的。下面是一个例子:

for (int i = 0; i < partsArray.size(); i++) {
    sentIntent = new Intent(this, _broadcastReceivers.SMSSentBroadcastReceiver.class);
    sentIntent.setAction("SMS_SENT_2" + System.currentTimeMillis());
    deliveredIntent = new Intent(this, DeliveryReceiver.class);
    deliveredIntent.setAction(C.SMS_DELIVERED + System.currentTimeMillis());
    sentPI = PendingIntent.getBroadcast(context, 0, sentIntent, 0);
    deliveredPI = PendingIntent.getBroadcast(context, 0, deliveredIntent, 0);

    sentPendingIntents.add(sentPI);
    deliveredPendingIntents.add(deliveredPI);
}
for(int i=0;i
我通过在每个动作后附加当前时间戳来确保动作是唯一的

您现在可以从
广播接收器的清单定义中删除
,因为您不再需要它了(您使用的是显式
意图
)。但是,请确保将
android:exported=“true”
添加到
BroadcastReceiver
的清单定义中,因为除非您拥有
或明确声明已导出它,否则它不会被导出