1. 程式人生 > >android 簡訊的接收和傳送處理

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.

Java

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