您的位置:首页 > 移动开发 > Android开发

高通Android4.4短信发送流程

2015-04-13 11:11 423 查看
高通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与下层通信。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: