Android缺彩信源码解析-短信发送流程(二)

Android短彩信源码解析-短信发送流程(二)转载请注明出处:http://blog.csdn.net/droyon/article/details/11

Android短彩信源码解析-短信发送流程(二)

转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935

2,短彩信发送framework逻辑

短信在SmsSingleRecipientSender.java中包装了SentIntents,以及DeliveryIntents,信息的内容在message中,信息的目的发送地址在mDest中,然后调用下面的代码进行信息的发送

private void handleSmsSent(Intent intent, int error) {        Uri uri = intent.getData();        mSending = false;        boolean sendNextMsg = intent.getBooleanExtra(EXTRA_MESSAGE_SENT_SEND_NEXT, false);        if (LogTag.DEBUG_SEND) {            Log.v(TAG, "handleSmsSent uri: " + uri + " sendNextMsg: " + sendNextMsg +                    " mResultCode: " + mResultCode +                    " = " + translateResultCode(mResultCode) + " error: " + error);        }        if (mResultCode == Activity.RESULT_OK) {            if (LogTag.DEBUG_SEND || Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {                Log.v(TAG, "handleSmsSent move message to sent folder uri: " + uri);            }            if (!Sms.moveMessageToFolder(this, uri, Sms.MESSAGE_TYPE_SENT, error)) {                Log.e(TAG, "handleSmsSent: failed to move message " + uri + " to sent folder");            }            if (sendNextMsg) {                sendFirstQueuedMessage();            }            // Update the notification for failed messages since they may be deleted.            MessagingNotification.updateSendFailedNotification(this);        } else if ((mResultCode == SmsManager.RESULT_ERROR_RADIO_OFF) ||                (mResultCode == SmsManager.RESULT_ERROR_NO_SERVICE)) {            if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {                Log.v(TAG, "handleSmsSent: no service, queuing message w/ uri: " + uri);            }            // We got an error with no service or no radio. Register for state changes so            // when the status of the connection/radio changes, we can try to send the            // queued up messages.            registerForServiceStateChanges();            // We couldn't send the message, put in the queue to retry later.            Sms.moveMessageToFolder(this, uri, Sms.MESSAGE_TYPE_QUEUED, error);            mToastHandler.post(new Runnable() {                public void run() {                    Toast.makeText(SmsReceiverService.this, getString(R.string.message_queued),                            Toast.LENGTH_SHORT).show();                }            });        } else if (mResultCode == SmsManager.RESULT_ERROR_FDN_CHECK_FAILURE) {            mToastHandler.post(new Runnable() {                public void run() {                    Toast.makeText(SmsReceiverService.this, getString(R.string.fdn_check_failure),                            Toast.LENGTH_SHORT).show();                }            });        } else {            messageFailedToSend(uri, error);            if (sendNextMsg) {                sendFirstQueuedMessage();            }        }    }

主要是根据ResultCode进行一些逻辑处理,比如如果发送成功,那么会首先更新短信由待发送变为已发送状态,并且更新Notification等。

如果需要发送报告,那么相关的逻辑大体相似,不再详细介绍。


Ps:发送成功,回调会从moderm那里带回来一个MessageRef,这是一个int值,很重要噢。


短信发送framework层逻辑大体介绍到这里,framework层的短彩信逻辑还有好多,比如接收信息的流程,或者接收长短信的流程等,不再一一介绍了。