我有一个android应用程序,可以在短时间内发送大量消息,并且该应用程序需要处理交付报告。这一切都很好,应用程序运行稳定,没有任何崩溃,消息被发送,交付报告工作正常。。。好一段时间了。
假设我在一条消息之后发送一条消息(前一条消息之后的每条消息都已成功发送-我正在查看smssent PendingEvent-只有当hasonprogresssend==false时,我才能发送新消息)。交付报告可以正常工作约1-2小时。然后,交付报告的行为异常。不断地删除几个交付报告。
因此,在发送完成后,大约7小时后,大约8000条短信的发送报告会停止发送,但是收到了很多短信,但应用程序没有收到发送报告。
但现在出现了奇怪的部分:)。第二天,我又做了一次测试,又发了8000条短信。邮件会立即发送给收件人,但我收到的是前一天的传递报告,而不是前一天的。我试着换了我的sim卡,还收到了前一天发送的邮件。
在我重新启动应用程序后,一切都是一样的,从最后一天的交付报告。但在我重新启动设备后,它的表现仍与前一天一样(大约1-2小时工作正常,然后交付报告的速度大大降低)。
所以总结一下:我收到的交付报告很好,直到看起来某个设备队列已满。在此之后,交付报告非常缓慢。又过了一天,当我再次开始发送(使用新的sim卡)时,我的delivery broadcastreceiver从昨天发送的邮件中获取了昨天未发送的邮件的发送报告。重新启动后,应用程序是相同的。重新启动设备后,它开始像第一天一样工作。因此,如果我的BrodactReceiver在我的活动的oncreate方法中注册,并且应用程序重新启动没有帮助,那么这一定是一些android队列问题,我需要在我的应用程序中以某种方式处理这些问题(可能是为了减慢发送速度,成功发送消息后再延迟一段时间,或者如果多条未发送的消息大于某个值,则停止发送?)
谢谢,很抱歉问了这么大的问题:)
我在oncreate中注册了两个BroadCars接收器:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
... check all persmissions
receiverSentGlobal = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
hasOnProgressSend = false;
JSONObject currentMsgSentStatus = new JSONObject();
try {
currentMsgSentStatus.put("msg_id", intent.getStringExtra("msg_id"));
currentMsgSentStatus.put("sim_id", intent.getStringExtra("sim_id"));
} catch (JSONException e) {
e.printStackTrace();
}
switch (getResultCode()) {
case Activity.RESULT_OK:
try {
currentMsgSentStatus.put("status", "OK");
} catch (JSONException e) {
e.printStackTrace();
}
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
try {
currentMsgSentStatus.put("status", "GENERIC_FAILURE");
} catch (JSONException e) {
e.printStackTrace();
}
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
try {
currentMsgSentStatus.put("status", "NO_SERVICE");
} catch (JSONException e) {
e.printStackTrace();
}
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
try {
currentMsgSentStatus.put("status", "NULL_PDU");
} catch (JSONException e) {
e.printStackTrace();
}
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
try {
currentMsgSentStatus.put("status", "RADIO_OFF");
} catch (JSONException e) {
e.printStackTrace();
}
break;
}
sendStatus.put(currentMsgSentStatus);
}
};
registerReceiver(receiverSentGlobal, new IntentFilter(ACTION_SMS_SENT));
receiverDeliveryGlobal = new BroadcastReceiver() {
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
public void onReceive(Context context, Intent intent) {
JSONObject currentMsgDeliveryStatus = new JSONObject();
try {
currentMsgDeliveryStatus.put("msg_id", intent.getStringExtra("msg_id"));
currentMsgDeliveryStatus.put("sim_id", intent.getStringExtra("sim_id"));
} catch (JSONException e) {
e.printStackTrace();
}
switch (getResultCode()) {
case Activity.RESULT_OK:
try {
currentMsgDeliveryStatus.put("status", "DELIVERED");
} catch (JSONException e) {
e.printStackTrace();
}
break;
case Activity.RESULT_CANCELED:
try {
currentMsgDeliveryStatus.put("status", "CANCELED");
} catch (JSONException e) {
e.printStackTrace();
}
break;
}
deliveryStatus.put(currentMsgDeliveryStatus);
}
};
registerReceiver(receiverDeliveryGlobal, new IntentFilter(ACTION_SMS_DELIVERED));
...
}
我的sendsms方法:
SmsManager sm;
... there is also some code to handle subscription, but let's make it more simple
sm = SmsManager.getDefault();
ArrayList<String> parts = sm.divideMessage(msg);
Intent iSent = new Intent(ACTION_SMS_SENT);
iSent.putExtra("msg_id", msgId);
iSent.putExtra("sim_id", String.valueOf(lastSendSimId));
PendingIntent piSent = PendingIntent.getBroadcast(this, Integer.parseInt(msgId), iSent, PendingIntent.FLAG_ONE_SHOT);
//Intent iDel = new Intent(ACTION_SMS_DELIVERED+msgId);
Intent iDel = new Intent(ACTION_SMS_DELIVERED);
iDel.putExtra("msg_id", msgId);
iDel.putExtra("sim_id", String.valueOf(lastSendSimId));
PendingIntent piDel = PendingIntent.getBroadcast(this, Integer.parseInt(msgId), iDel, PendingIntent.FLAG_ONE_SHOT);
if (parts.size() == 1)
{
msg = parts.get(0);
sm.sendTextMessage(number, null, msg, piSent, piDel);
}
else
{
ArrayList<PendingIntent> sentPis = new ArrayList<PendingIntent>();
ArrayList<PendingIntent> delPis = new ArrayList<PendingIntent>();
int ct = parts.size();
for (int i = 0; i < ct; i++)
{
sentPis.add(i, piSent);
delPis.add(i, piDel);
}
sm.sendMultipartTextMessage(number, null, parts, sentPis, delPis);
}
hasOnProgressSend = true;
编辑1:刚找到-通过向2个号码发送消息进行测试。a号在在线设备中,b号在关机设备中。直到大约250封未送达b的邮件,应用程序才收到a的送达报告。在250封未送达的邮件之后,将停止向应用发送a的送达通知。为b通电后,发送到a的所有消息都会收到所有通知。因此,大约有250个等待交付报告的队列。有没有办法将交货期限制在10分钟左右?
1条答案
按热度按时间iezvtpos1#
好的,发现问题了。设备上大约有250个待定的交付意图。因此,我需要以某种方式限制或取消旧的交付挂起的意图。