• sms接收流程(Java Framework)


    sms接收流程(只包含Java部分)

    主要根据打印的mms log,和网上的相关资料对Sms接收流程做一个了解

    一个sms的完整接收过程:
    radio log
    02-26 15:54:20.796 D/AT      (  101): Channel3: AT< +CMT: ,24
    02-26 15:54:20.796 D/AT      (  101): Channel3: AT< 0891683108200105F0040D91685108304727F100083120625145012304611F89C9
    02-26 15:54:20.796 D/RILC    (  101): [UNSL]< UNSOL_RESPONSE_NEW_SMS {0891683108200105F0040D91685108304727F100083120625145012304611F89C9}

    02-26 15:54:20.796 D/RILJ    (  428): [1][UNSL]< [1]UNSOL_RESPONSE_NEW_SMS
    02-26 15:54:20.796 D/GSM     (  428): SMS parsePdu
    02-26 15:54:20.796 D/GSM     (  428): SMS getSCAddress
    02-26 15:54:20.806 D/SMS     (  428): dispatchNormalMessage >>>>>
    // 02-26 15:54:20.836 D/GSM     (  539): SMS parsePdu
    // 02-26 15:54:20.836 D/GSM     (  539): SMS getSCAddress

    1. 最前面1、2、3行属于lib层的处理,这里暂时不作分析

    2. 当Java层通过Socket收到下层上报的消息之后,会根据消息的类型调用相关处理函数,
    这里调用 handleUnsolicited(Parcel) 处理网络主动上报的消息。
      函数处理上报的sms消息:
       switch (response)
        case RIL_UNSOL_RESPONSE_NEW_SMS: ret = responseString(parcel); break;
        
      这里会走log的第4条
      
    3. 进一步处理消息,将其封装并向上进行通知
       switch (response)
        case RIL_UNSOL_RESPONSE_NEW_SMS:
         String a[] = new String[2];
         a[1] = (String) ret;
         
         SmsMessage sms;
         sms = SmsMessage.newFromCMT(a);
         if (mGsmSmsRegistrant != null) {
          mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));
         }
         break;

    首先,调用reponseString(Parcel)来解析底层上报的消息,
    再, 利用解析的结果封装一个SmsMessage对象,这个对象是:android.telephony.SmsMessage,
      其中,会利用com.android.internal.telephony.gsm.SmsMessage.newFromCMT(lines);来解析字串
      并生成相关对象:new SmsMessage(wrappedMessage);
      
      这之中会走log的5、6两条
      
    4. 通知上层新消息到来,
      mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));
      
      mGsmSmsRegistrant的注册:
      GsmSMSDispatcher.java: mCM.setOnNewGsmSms(this, EVENT_NEW_SMS, null);
      BaseCommands.java:  mGsmSmsRegistrant = new Registrant(h, what, obj);
      这样,当新消息来临时,就可以通过这个注册来通知了
      
    5. GsmSMSDispatcher.java收到消息,进行处理(实际上是SMSDispatcher.java)
      调用栈
       int result = dispatchMessage(sms.mWrappedMessage);
         return dispatchNormanMessage(smsb);  // 打印第7条
       
       
       dispatchPdus(pdus);
       dispatch(intent, RECEIVE_SMS_PERMISSION);
       mContext.sendOrderedBroadcast(intent, permission, mResultReceiver, this, Activity.RESULT_OK, null, null);
       
       最后,我们可以看出这个方法将短信通过顺序广播播放出去(action是SMS_RECEIVED_ACTION)。
      

  • 相关阅读:
    并发编程学习笔记(15)----Executor框架的使用
    并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理
    并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理
    并发编程学习笔记(12)----Fork/Join框架
    并发编程学习笔记(11)----FutureTask的使用及实现
    并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
    设计模式:代理模式
    设计模式:装饰模式
    设计模式:几大原则
    设计模式:策略模式(Strategy)
  • 原文地址:https://www.cnblogs.com/caidi/p/2937544.html
Copyright © 2020-2023  润新知