android 簡訊的接收和傳送處理
一 初始化
手機開機初始化呼叫GSMPhone 建構函式。
GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode)
建立 mSMS = new GsmSMSDispatcher(this);
該類繼承於SMSDispatcher。類SMSDispatcher中建構函式中初始化了 簡訊的訊息
mCm.setOnNewSMS(this, EVENT_NEW_SMS, null);
mCm.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);
mCm.setOnIccSmsFull(this, EVENT_ICC_FULL, null);
handleMessage定義了sms的訊息處理函式
public void handleMessage(Message msg) {
……
case EVENT_NEW_SMS:
……
}
mSimSmsIntManager = new SimSmsInterfaceManager(this);
SimSmsInterfaceManager繼承於IccSmsInterfaceManager 為Isms.stub的實現類.
在IccSmsInterfaceManager 類實現了 Isms.adil. 中定義的方法,以實現遠端呼叫。
二 簡訊傳送
簡訊傳送呼叫介面
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(string1, null, string2, p, null);
sendTextMessage 呼叫 sendRawPdu。
在sendRawPdu中 建立了
ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
通過aidl介面,例項化 IccSmsInterfaceManager. 呼叫 smsDispatcher.
protected void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,
PendingIntent deliveryIntent) 函式。
而後通過stub 介面呼叫sendSMS 介面。
RIL.java 中 sendSMS
public void
sendSMS (String smscPDU, String pdu, Message result) {
RILRequest rr
= RILRequest.obtain(RIL_REQUEST_SEND_SMS, result);
…..
send(rr);
}
傳送 RIL_REQUEST_SEND_SMS 的 Request 請求到rild層。
Rild與modem之間聯絡與其它應用類似,不再重複。
三 簡訊的接收
Modem 與rild之間不再重複。從ril層中收到訊息開始。
Ril.java中 rilReceiver 收到信簡訊訊息processResponse(p); 收到簡訊屬於主動上報
呼叫processUnsolicited函式。
private void processUnsolicited (Parcel p) {
………
case RIL_UNSOL_RESPONSE_NEW_SMS: ret = responseString(p); break;
…….
switch(response) {
case RIL_UNSOL_RESPONSE_NEW_SMS: {
…….
SmsMessage sms;
…….
sms = SmsMessage.newFromCMT(a);
if (mSMSRegistrant != null) {
mSMSRegistrant
.notifyRegistrant(new AsyncResult(null, sms, null));
}
break;
}
…….
}
mSMSRegistrant 呼叫到Registrant.java檔案中notifyRegistrant方法。
internalNotifyRegistrant 呼叫sendMessage 方法。
public void notifyRegistrant(AsyncResult ar)
{
internalNotifyRegistrant (ar.result, ar.exception);
}
internalNotifyRegistrant 收到訊息後將訊息傳送到訊息佇列。
/*package*/ void
internalNotifyRegistrant (Object result, Throwable exception)
{
Handler h = getHandler();
if (h == null) {
clear();
} else {
Message msg = Message.obtain();
msg.what = what;
msg.obj = new AsyncResult(userObj, result, exception);
h.sendMessage(msg);
}
}
sendMessage 依次呼叫Handler.java 檔案中 sendMessage->sendMessageDelayed-> sendMessageAtTime 在 sendMessageAtTime中將該簡訊訊息加入到 訊息佇列中。
sent = queue.enqueueMessage(msg, uptimeMillis);
public boolean sendMessageAtTime(Message msg, long uptimeMillis)
{
boolean sent = false;
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);
}
else {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}
Looper.java 中loop方法。用於將訊息佇列中訊息dispatch出去。
public static final void loop() {
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next(); // might block
//if (!me.mRun) {
// break;
//}
if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
return;
}
if (me.mLogging!= null) me.mLogging.println(
">>>>> Dispatching to " + msg.target + " "
+ msg.callback + ": " + msg.what
);
msg.target.dispatchMessage(msg);
if (me.mLogging!= null) me.mLogging.println(
"<<<<< Finished to " + msg.target + " "
+ msg.callback);
msg.recycle();
}
}
}
dispatchMessage函式呼叫當前handle的訊息處理函式。
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
呼叫到smsDispatcher.java中
public void handleMessage(Message msg) {
AsyncResult ar;
switch (msg.what) {
case EVENT_NEW_SMS:
………
}
}
從而實現了對新收到的簡訊的處理。
http://blog.csdn.net/tjy1985/article/details/7228294