歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中SMS的接收處理

在解析WAPPUSH over SMS時,看了一下Android裡SMS接收的流程,並按照自己需要的流程記錄,其他的分支處理並未講述。PDU數據的encode/decode並未解析,有興趣的讀者可以到相應的代碼處自己解讀一下。

Android中,RIL用RILReciever接收SMS pdu,並根據不同的信息類型用相應函數來處理。因手機制式的差異,用GsmSmsDispatcher或CdmaSmsDispatcher來做各自的消息處理並分發。最後的分發是通過發送相應的Broadcast,所以,對感興趣的消息處理,可以注冊Receiver來監聽相應的Broadcast,實現自己的SMS/MMS/Wap push,以及其他類型消息的接收處理。

RIL構造函數中,Receiver的初始化[在文件RIL.java中]

[java]
  1. mReceiver = newRILReceiver();  
  2. mReceiverThread =new Thread(mReceiver, "RILReceiver");  
  3. mReceiverThread.start();  

其中的類型

  • mReceiver: RILReceiver
  • mReceiverThread: Thread

 

RILReceiver實現了Runnable


關注RILReceiver線程的實現[在RILReceiver::run()中]

[java]
  1. public void run() {  
  2.     int retryCount= 0;  
  3.   
  4.     try {for (;;) {  
  5.         LocalSockets = null;  
  6.         LocalSocketAddress l;  
  7.   
  8.         try {  
  9.             s = newLocalSocket();  
  10.             l = newLocalSocketAddress(SOCKET_NAME_RIL,  
  11.                    LocalSocketAddress.Namespace.RESERVED);  
  12.             s.connect(l);  
  13.         } catch (IOException ex){  
  14.             // 。。。   
  15.         }  
  16.   
  17.         retryCount= 0;  
  18.         mSocket =s;  
  19.         int length= 0;  
  20.   
  21.         try {  
  22.             InputStreamis = mSocket.getInputStream();  
  23.   
  24.             for(;;) {  
  25.                Parcel p;  
  26.   
  27.                length = readRilMessage(is, buffer);  
  28.                 if(length < 0) {  
  29.                    // End-of-stream reached   
  30.                    break;  
  31.                 }  
  32.   
  33.                 p =Parcel.obtain();  
  34.                p.unmarshall(buffer, 0, length);  
  35.                p.setDataPosition(0);  
  36.   
  37.                 processResponse(p);  
  38.                p.recycle();  
  39.             }  
  40.         } catch(java.io.IOException ex) {  
  41.             // …   
  42.         } catch(Throwable tr) {  
  43.             // …   
  44.         }  
  45.   
  46.         // …   
  47.     }} catch(Throwable tr) {  
  48.        Log.e(LOG_TAG,"Uncaught exception", tr);  
  49.     }  
  50. }  

RILReceiver線程不停的監聽本地Socket,讀到數據之後在processResponse()[Line#37]中處理。

[java]
  1. private void processResponse (Parcel p) {  
  2.     int type;  
  3.   
  4.     type = p.readInt();  
  5.   
  6.      if(type == RESPONSE_UNSOLICITED) {  
  7.         processUnsolicited (p);  
  8.      }else if (type == RESPONSE_SOLICITED) {  
  9.         processSolicited (p);  
  10.      }  
  11.   
  12.     releaseWakeLockIfDone();  
  13.  }  

如果類型屬於Unsolicited消息,則在processUnsolicited()中處理。收到的短信是屬於Unsolicited信息,看它的實現。

processUnsolicited()中很長的switch… case語句中對收到短信的處理在case RIL_UNSOL_RESPONSE_NEW_SMS:

[java]
  1. SmsMessage sms;  
  2.   
  3.  sms = SmsMessage.newFromCMT(a);  
  4.  if (mSMSRegistrant != null) {  
  5.      mSMSRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));  
  6.  }  
Copyright © Linux教程網 All Rights Reserved