高通Android4.4短信发送流程
2015-04-13 11:11
423 查看
高通Android4.4短信发送流程
KEY POINT
1:confirmSendMessageIfNeeded()中检查是否有是新建会话、区分短彩信和是否单双卡。
(1):如果是彩信,才看是否有开启数据链接。
(2):新建会话,检查联系人的正确与否。
(3):双卡时,判断是否弹出sim的选择。
2:在WorkingMessage中send()中区分彩信和短信,进入分别的发送流程。
在短信发送流程的中得到activity的SharedPreferences是否有签名,然后启动新线程进行短信发送流程。
3:在WorkingMessage的sendSmsWorker()中初始化SmsMessageSender,调用sendMessage(),然后调用ComposeMessageActivity的onMessageSent(),进行UI界面上的更新。
4:SmsMessageSender的queueMessage()中, Sms.addMessageToUri进行数据库的insert动作,然后sendBroadcast散发广播进行后台发送。
KEY POINT
1:InsertInner()中通过URI确定插入的表,对插入的值重新组合,比如更新时间和状态等
2:insertWithOnConflict()中,组合SQL查询语句,新建SQLiteStatement对value进行添加,最后执行SQL。
3:添加数据的过程在SQLiteProgram类的构造函数中,主要是数据拷贝
4:在InsertInner()流程中,正常数据insert后,通过db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv) 对words 这个虚表进行insert,达到提高查询效率的提高。
Sending Work 1主要是数据的transaction
KEY POINT
1:SmsReceiverService的handleSendMessage中
判断当前卡是否标记发送,没有则开始发送。
2:SmsReceiverService的sendFirstQueuedMessage中
查询到queued中的数据,进行升序排列,然后发送第一条。
3:moveMessageToFolder对sms表的read值进行重新更新,更新成true。
4:SmsSingleRecipientSender的sendMessage中处理对一条sms记录的拆分和发送.需要特别注意的是: 如果一条sms拆分成n条sms, 该方法会对应构造n个broadcast receiver来对应的intent处理sent回报消息,但是最多只有一个delivery intent,且肯定是第n条sms的delivery intent才不为null.同时SmsReceiveService正是根据EXTRA_MESSAGE_SENT_SEND_NEXT是否为true来决定是否开始下一条sms的发送流程的。
Sending Work 2 主要是framework层与下层的rild进程的socket通信
KEY POINT
1:SmsManager与IccSmsInterfaceManager之间跨进程通信,用到了binder调用IccSmsInterfaceManager的sendMultipartTextWithOptions。
2:ImsSMSDispatcher的sendMultipartText中
对网络进行判断, 这里我选的GsmSMSDispatcher.sendMultipartText的流程。注意GsmSMSDispatcher的继承关系图
3::GsmSMSDispatcher的sendNewSubmitPdu中对短信数据进行打包放入一个SmsTracker,调用sendSms进入发送到ril的流程。
4:ril的send中msg.sendToTarget()进入RILSender的handleMessage,在case EVENT_SEND调用socket与下层通信。
SMS Send flow about UI
KEY POINT
1:confirmSendMessageIfNeeded()中检查是否有是新建会话、区分短彩信和是否单双卡。
(1):如果是彩信,才看是否有开启数据链接。
(2):新建会话,检查联系人的正确与否。
(3):双卡时,判断是否弹出sim的选择。
2:在WorkingMessage中send()中区分彩信和短信,进入分别的发送流程。
在短信发送流程的中得到activity的SharedPreferences是否有签名,然后启动新线程进行短信发送流程。
3:在WorkingMessage的sendSmsWorker()中初始化SmsMessageSender,调用sendMessage(),然后调用ComposeMessageActivity的onMessageSent(),进行UI界面上的更新。
4:SmsMessageSender的queueMessage()中, Sms.addMessageToUri进行数据库的insert动作,然后sendBroadcast散发广播进行后台发送。
[edit]Insert
In DataBase
KEY POINT
1:InsertInner()中通过URI确定插入的表,对插入的值重新组合,比如更新时间和状态等
2:insertWithOnConflict()中,组合SQL查询语句,新建SQLiteStatement对value进行添加,最后执行SQL。
3:添加数据的过程在SQLiteProgram类的构造函数中,主要是数据拷贝
if (mNumParameters != 0) { mBindArgs = new Object[mNumParameters]; if (bindArgs != null) { System.arraycopy(bindArgs, 0, mBindArgs, 0, bindArgs.length); } } else { mBindArgs = null; }
4:在InsertInner()流程中,正常数据insert后,通过db.insert(TABLE_WORDS, Telephony.MmsSms.WordsTable.INDEXED_TEXT, cv) 对words 这个虚表进行insert,达到提高查询效率的提高。
[edit]Background
Sending Work
Sending Work 1主要是数据的transactionKEY POINT
1:SmsReceiverService的handleSendMessage中
private void handleSendMessage(Intent intent) { int subscription = intent.getIntExtra(SUBSCRIPTION_KEY, MSimSmsManager.getDefault().getPreferredSmsSubscription()); if (!mSending[subscription]) { sendFirstQueuedMessage(subscription); } }
判断当前卡是否标记发送,没有则开始发送。
2:SmsReceiverService的sendFirstQueuedMessage中
// get all the queued messages from the database final Uri uri = Uri.parse("content://sms/queued"); ContentResolver resolver = getContentResolver(); String where = "sub_id=?"; String[] whereArgs = new String[] {Integer.toString(subscription)}; Cursor c = SqliteWrapper.query(this, resolver, uri, SEND_PROJECTION, where, whereArgs, "date ASC");
查询到queued中的数据,进行升序排列,然后发送第一条。
3:moveMessageToFolder对sms表的read值进行重新更新,更新成true。
4:SmsSingleRecipientSender的sendMessage中处理对一条sms记录的拆分和发送.需要特别注意的是: 如果一条sms拆分成n条sms, 该方法会对应构造n个broadcast receiver来对应的intent处理sent回报消息,但是最多只有一个delivery intent,且肯定是第n条sms的delivery intent才不为null.同时SmsReceiveService正是根据EXTRA_MESSAGE_SENT_SEND_NEXT是否为true来决定是否开始下一条sms的发送流程的。
Sending Work 2 主要是framework层与下层的rild进程的socket通信
KEY POINT
1:SmsManager与IccSmsInterfaceManager之间跨进程通信,用到了binder调用IccSmsInterfaceManager的sendMultipartTextWithOptions。
2:ImsSMSDispatcher的sendMultipartText中
protected void sendMultipartText(String destAddr, String scAddr, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, int priority, boolean isExpectMore, int validityPeriod) { if (isCdmaMo()) { mCdmaDispatcher.sendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents, priority, isExpectMore, validityPeriod); } else { mGsmDispatcher.sendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents, priority, isExpectMore, validityPeriod); } }
对网络进行判断, 这里我选的GsmSMSDispatcher.sendMultipartText的流程。注意GsmSMSDispatcher的继承关系图
3::GsmSMSDispatcher的sendNewSubmitPdu中对短信数据进行打包放入一个SmsTracker,调用sendSms进入发送到ril的流程。
4:ril的send中msg.sendToTarget()进入RILSender的handleMessage,在case EVENT_SEND调用socket与下层通信。
相关文章推荐
- Android4.4 Telephony流程分析——短信(SMS)发送过程
- 高通android 7.0短信发送流程
- android4.4的短信发送流程
- Android4.4 Telephony流程分析——短信(SMS)接收过程
- 短信发送流程:系统短信(SMS)发送流程
- 高通android 7.0短信会话界面加载流程
- Android Mms短信的发送流程,短信发送源码解析
- 短信发送--短信的发送流程(framework)
- GPRS模块发送短信流程
- Android短彩信源码解析-短信发送流程(二)
- 简述Android短信发送流程
- Android 短信发送流程(修改版)
- Android短信发送流程(原)
- Android Mms之:短信发送流程(图文详解)
- Android短信发送流程之普通短信发送(原)
- AT指令发送短信流程
- Android源码学习笔记1-短信发送流程分析
- Android短信发送和接收流程源码分析
- 关于提高MTK,展讯,高通 平台,双卡发送短信的成功率,选卡发送问题解决
- AT指令发送短信流程