一。对于ComposeMessageActivity中确认接受者信息有效性的(confirmSendMessageIfNeeded())流程的分析,最后调用sendMessage()。
进入该法后做如下判断:
1.判断接收者编辑是否可见,如果不可见则表示会话已经存在,接收者肯定有效。如果可见则需要进行下面的判断。
2. 是否可以发送,即判断信息发送的条件,如果条件允许则进入下面判断。
3.判断是否有无效接收者,如果没有则表示接收者有效。若存在无效接收者,则需要进行下面判断。
4.判断是否存在有效接收者,如果存在则会提示有无效接收者,包含尝试发送按钮。如果没有,则会提示接收者无效,仅有取消发送按钮.
二。关于ComposeMessageActivity中的sendMessage()方法的调用,该方法的主要作用是手机的状态。并做出相应的处理。
该法的执行和判断如下处理如下:
1.先判断发送的信息是不是彩信(是唤灯片和附件)。如果是判断其大小是否超出限制大小,如果超出则给出用户提示并且修改sendButton的状态为false;否则进行下面的判断。
2.判断是否为紧急状态。如果是紧急状态,则需要判断手机是否为紧急模式,如果是紧急模式则转为紧急模式Activity;如果不是紧急模式和紧急状态则进行如下判断。
3.判断信息是否处于发送状态,如果为发送状态则继续发送直到发送完毕;如果不为发送状态,则需要做出相应处理。(1)移除接收者监听器(2)调用WorkingMessage。send()方法,回调一次onMessageSent()方法是信息放入发送堆栈中。(3)添加接收者监听器
4.等待发送完该信息后,需要做是否退出Activity的判断!
附上代码:
private void sendMessage(boolean bCheckEcmMode) {
if (mWorkingMessage.requiresMms() && (mWorkingMessage.hasSlideshow() || mWorkingMessage.hasAttachment())) {
if (mWorkingMessage.getCurrentMessageSize() > MmsConfig.getUserSetMmsSizeLimit(true)) {
MessageUtils.showErrorDialog(ComposeMessageActivity.this,
getResourcesString(R.string.exceed_message_size_limitation),
getResourcesString(R.string.exceed_message_size_limitation));
updateSendButtonState();
return;
}
}
if (bCheckEcmMode) {
// TODO: expose this in telephony layer for SDK build
String inEcm = SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE);
if (Boolean.parseBoolean(inEcm)) {
try {
startActivityForResult(
new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
REQUEST_CODE_ECM_EXIT_DIALOG);
return;
} catch (ActivityNotFoundException e) {
// continue to send message
Log.e(TAG, "Cannot find EmergencyCallbackModeExitDialog", e);
}
}
}
ContactList contactList = isRecipientsEditorVisible() ?
mRecipientsEditor.constructContactsFromInput() : getRecipients();
mDebugRecipients = contactList.serialize();
if (!mSendingMessage) {
// send can change the recipients. Make sure we remove the listeners first and then add
// them back once the recipient list has settled.
removeRecipientsListeners();
//add for gemini TODO
if (FeatureOption.MTK_GEMINI_SUPPORT == true) {
mWorkingMessage.sendGemini(mSelectedSimId);
} else {
mWorkingMessage.send(mDebugRecipients);
}
mSentMessage = true;
mSendingMessage = true;
isInitRecipientsEditor = false; // when tap fail icon, don't add recipients
addRecipientsListeners();
mRecipients.setVisibility(View.GONE);
mMsgListView.setVisibility(View.VISIBLE);
bindToContactHeaderWidget(mConversation.getRecipients());
}
// But bail out if we are supposed to exit after the message is sent.
if (mExitOnSent) {
finish();
}
}
三。sendMessage()中使用的WorkingMessage.send()方法的作用是:根据短信和彩信的区别调用各自不同的方法对彩信或短信进行一些处理。
进入方法后进行如下操作:
1.将接收者列表放到当前会话中。
2.判断是否需要发送彩信或者包含Email到彩信的地址。若果不是则调用 preSendSmsWorker()此方法继续执行。如果是则进行如下操作(对彩信进行一些预处理)。
3.则创建所发信息的本地副本,因为后续的操作将不在主线程中进行,并且通过makeSendReq()获取返回一个非空的发送地址。创建并调用一个新的线程,并且确保幻灯片文本0不再持有引用信息文本框中的引用(即使用创建的副本)。在线程中调用sendMmsWorker()进行发送。
见下图 :