现在的位置: 首页 > 综合 > 正文

SMS的源码研究

2013年12月06日 ⁄ 综合 ⁄ 共 4764字 ⁄ 字号 评论关闭

SMS_UI---Layout
conversation_list_screen.xml
显示对话列表
conversation_list_actionbar.xml
未读对话列表的选中高亮 id:unread_conv_count 
conversation_list_multi_select_actionbar.xml
已选会话列表的选中高亮 id:selected_conv_count
conversation_list_item.xml
每组会话在列表中都是图片+fromdatesubject的形式
compose_message_activity.xml
编辑框 发送(id:send_button_sms) 全选 取消 删除

SMS---Src
1UI入口
ComposeMessageActivity extends Activity(com.android.mms.ui)
onCreate() 
initMessageSettings()
加载setting中的设置
initResourceRefs()
初始化UI控件
mSendButtonSms = (ImageButton) findViewById(R.id.send_button_sms);
mSendButtonSms.setOnClickListener(this); 
| (mUiHander
表示一个主线程的Handle对象)
onClick(View v) --> mUiHandler.sendEmptyMessageDelayed(MSG_RESUME_SEND_BUTTON, RESUME_BUTTON_INTERVAL);
等待指定的时间(1)之后发送消息到子线程
sendMessage()
允许你处理Message对象(Message里可以包含数据)sendEmptyMessage()只能放数据

SaveMsgThread extends Thread
启动消息队列机制
2)待传送的信息
WorkingMessage (com.android.mms.data)
即将发送的短信类
3)发送信息
SmsMessageSender implements MessageSender(com.android.mms.transaction)
为短信的发送作准备,使sms进入消息队列,分离接收人
SmsSingleRecipientSender extends MessageSender
发送一条短信,最终用frameworkSmsManager来发送信息
4)接收信息
SmsReceiver extends BroadcastReceiver(com.android.mms.transaction)
请求sms service的入口
PrivilegedSmsReceiver extends SmsReceiver(com.android.mms.transaction)
接收短信的类

SmsReceiverService extends Service(com.android.mms.transaction)sms的处理中心,处理信息的 send/receive,处理一些来自framework层的的通知。
MessageStatusReceiver extends BroadcastReceiver(com.android.mms.transaction)
捕获信息,并读取信息的状态

SMS---解读
1)发送信息的流程
用户在ComposeMessageActivitynew一个WorkingMessage对象
WorkingMessage
new一个SmsMessageSender对象
PendingIntent
是一个发送异步intent的类
本质上就是使用MessageSender接口发送信息,实现该接口必须实例化两个方法,分别是sendMessage(long token)setSimId(int simId)

framework层发送信息的方法 对应于android.telephony.SmsMessage;

所有发送的消息最终都要保存至消息队列,SmsReceiver--> SmsReceiverService --> SmsSingleRecipientSender -->framework:SmsManager


(2)
接收信息的流程
本质上是靠PrivilegedSmsReceiver类来接收信息

framework层接收信息的方法 对应于android.telephony.SmsMessage;
所有接收的消息最终都要保存到消息队列,SmsReceiverService --> SmsSingleRecipientSender -->framework:SmsManager

(3)数据库的存取
所有的消息,最终都会保存在sqlite中,对应的数据库操作涉及framework
framework:SqliteWrapper(android.database.sqlite)
framework:ContentResovler(android.content)
framework:SQliteDatabase
提供query()方法

MMS---初探
数据库层MmsSms的区别在于,sms直接用query()update(),mms则使用PduPersister(android.mms.pdu)
MMS
主要的处理都在app层,在framework层中主要涉及MMS pdu包的解析处理和发送和接受MMS时的网络处理。
pdu---(protocol description unit)
可以从接收到的pdu中创建新的SmsMessage实例,Toast界面组件可以以系统通知的形式来显示接收到的SMS消息文本。
MMS的操作直接就是对mmssms.db数据库的操作

(1)push MMS 接收
MMS
通知消息是以短信息PDU包的形式传递过来的(M-Notification.ind PDU)Android中的具体处理流程如下:
1
)当有新信息来的时候,atchannelreader线程会调用onUnsolicited()函数处理。
2
onUnsolicited()函数调用RIL_onUnsolicitedResponse()函数,并传入RIL_UNSOL_RESPONSE_NEW_SMS值及相应数据。
3
RIL_onUnsolicitedResponse()调用sendResponse()函数,通过socket(socket名:SOCKET_NAME_RIL)ril.java层传递数据。
4
ril java层通过RILReceiver接收器从socket中读出数据,处理后调用ril类中的processResponse()方法,processResponse()方法调用processUnsolicited()方法。
5
)在processUnsolicited()方法中,执行下面语句:
case RIL_UNSOL_RESPONSE_NEW_SMS: {
if (RILJ_LOGD) unsljLog(response);
String a[] = new String[2];
a[1] = (String)ret;
SmsMessage sms;
sms = SmsMessage.newFromCMT(a); //
根据SMS协议解析PDU
if (mSMSRegistrant != null) {
mSMSRegistrant.notifyRegistrant(new AsyncResult(null, sms, null)); 
}
break;
其中mSMSRegistrant实例是在初始化的时候创建的,其中存储着SMSDispatcher handler对象和EVENT_NEW_SMS事件信息。
随后通过message消息机制和handler处理机制把EVENT_NEW_SMS事件传递到了SMSDispatcher handler类 处理。
6
SMSDispatcher handler接收到EVENT_NEW_SMS事件,调用handleMessage()方法处理,handleMessage()方法调用其子类dispatchMessage()方法。
7
)在dispatchMessage()中,根据smsHeader.portAddrs(PORT_WAP_PUSH = 2948)地址来判断是否是PUSH信息。
8
)调用WapPushOverSms类的dispatchWapPdu()方法。
9
)使用WspTypeDecoder类实例来对PUSH信息进行解析,并根据content type来判断是否是MMS PUSH信息。
10
)调用dispatchWapPdu_MMS()方法,通过SMSDispatcher类的dispatch()方法来广播发送intent. WAP_PUSH_RECEIVED_ACTION
11
PushReceiver接收到该intent,启动ReceivePushTas并执行doInBackground()方法。
12
)在doInBackground()方法中,通过PduParser类对象解析对应的PDU包,然后执行如下代码:
case MESSAGE_TYPE_NOTIFICATION_IND: {
NotificationInd nInd = (NotificationInd) pdu;
if (!isDuplicateNotification(mContext, nInd)) {
Uri uri = p.persist(pdu, Inbox.CONTENT_URI); //MMS PUSH
信息存储在inbox.
Intent svc = new Intent(mContext, TransactionService.class);//intent
启动的是TransactionService
svc.putExtra(TransactionBundle.URI, uri.toString());
svc.putExtra(TransactionBundle.TRANSACTION_TYPE,
Transaction.NOTIFICATION_TRANSACTION);//transaction
类型:NOTIFICATION_TRANSACTION
mContext.startService(svc);//
启动TransactionService服务
}
13
TransactionService类中的onStart()调用launchTransaction()方法
14
launchTransaction()方法传递给ServiceHandler EVENT_TRANSACTION_REQUEST事件。
15
ServiceHandler类的handleMessage()方法处理EVENT_TRANSACTION_REQUEST事件,根据Transaction的类型为NOTIFICATION_TRANSACTION
创建NotificationTransaction类实例,并根据URImmssms.db中取出PDU包。
16
)调用processTransaction(transaction)方法,在processTransaction()方法中,执行如下代码:
int connectivityResult = beginMmsConnectivity();//
通过beginMmsConnectivity函数进行data connection
if (connectivityResult == Phone.APN_REQUEST_STARTED) { //
如果返回APN_REQUEST_STARTED结果,表

抱歉!评论已关闭.