高通Android4.4短信发送流程
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主要是数据的transaction

KEY 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系统中短信发送的整个流程,包括UI交互、数据库操作以及后台发送机制。从确认发送消息条件到数据库插入,再到后台工作的处理,如数据事务和socket通信,深入剖析了短信发送的各个环节。

217

被折叠的 条评论
为什么被折叠?



