SMS send:
?
?
ComposeMessageActivity(信息编辑View)
1. confirmSendMessageIfNeeded?? ->???是否收信人编辑View是否存在并已经显示
2. sendMessage????? ->????? 判断是否为紧急模式,true:显示notice? false:收信人数据处理
?
WorkingMessage
1.send????? ->????? 收件人数据处理
2. preSendSmsWorker???? ->????? 删除草稿箱的数据
3. sendSmsWorker? ->????? 格式化联系人数据,确保SMS没有超过最大数据极限
?
SmsMessageSender
1. sendMessage
2. queueMessage??? ->????? 判断是否需要发送报告;将收件人及信息存入发送队列,发送ACTION_SEND_MESSAGE广播,通知SmsReceiver去发送消息
?
SmsReceiver
1. onReceiveWithPrivilege
2. beginStartingService?? ->????? 开启SmsReceiverService
?
SmsReceiverService
1. ServiceHandler??? -> ?? 处理传入的请求
2. handleSendMessage?? ->????? 处理SMS发送函数,假如没有信息在发送,调用sendFirstQueuedMessage
3. sendFirstQueuedMessage? ->????? 从队列数据中读取要发送的信息数据,调用SmsSingleRecipientSender的sendMessage函数发送信息,
?
SmsSingleRecipientSender
1. sendMessage????? ->????? 切割信息,将信息移动到以发送库中,调用framework接口发送信息
?
?
? Framework发送信息后,SmsReceiver接受包含resultcode数据的广播,交给SmsReceiverService根据不同的result code做相应的操作:
?
1.假如发送成功,将信息设置为发送成功,查看是否还有需要发送的信息,如果有,调用sendFirstQueuedMessage继续发送;
?
2.当无服务&radio off时,将信息移动到发送队列,注册ServiceState监听器,当状态变化,ap尝试重发信息;
?
3.当FDN启动时,只能向固定拨号号码发送信息;
?
4.其他情况将信息设置为发送失败,查看队列是否有需要发送的下一条消息
?
?
?前面提到,ap发送处理过程中,总是将信息移来移去的,什么含义呢?让我们来从SMS的DB说起,SMS的数据是存放在数据库当中的(/data/data/com.android.providers.telephony /mmssms.db),DB中的sms表存储的就是短信的数据,包括回话ID(thread_id),地址(address),类型(type), 内容(body)等数据字段;这里讲到的移来移去其实就是设置type这个字段,type字段有7个值代表不同的意思,分别是 0(所有信息),1(收信夹),2(发信夹),3(草稿),4(已发送),5(发送失败),6(发送队列);
?
?
===========================================================================
?
?
SMS Receive:
?
?
? 当接收到SMS的时候,framework发出SMS_RECEIVED_ACTION广播,SmsReceiver接收到广播,开启SmsReceiverService,SmsReceiverService调用handleSmsReceived函数处理接收到的信息:从intent中获取出SmsMessage, 将SMS数据保存到DB中,然后通知User