短信发送失败时,是怎样重发的?
[SOLUTION]
目前短信重发分别做在Modem和 App ,对应不同的情况。
Modem:
Modem的重发做在SMS-TL/ SMS-CM,针对发送短信中的暂时性的错误。
其中涉及到很多底层技术细节,并且这些对于App层来说都是透明的。
但Modem端的处理可以保证会有1次重发,最长的等待时间是21秒。
Modem的重发如果失败了,会通知给App,这时候App就会显示发送失败。同时用户可以手动重发。
App
-针对的是网络不可用的情况(脱网导致短信发送失败)。
-如果发送短信时发现网络不可用,会向framework注册ServiceState广播。
-当网络恢复时,App会收到广播并重新发送。
-这种重发没有时间限制,会等待网络恢复再去重发。
-这部分的处理都是在 SmsReceiverService.java 中,当 底层返回了 Radio_off或 No_service时,在handleSmsSent() 中 有注册 ServiceState: registerForServiceStateChanges(), 当网络恢复时,接收此广播, 在 handleServiceStateChanged() 中对失败的短信重试。