收信息

作者: 坠叶飘香 | 来源:发表于2019-05-21 23:22 被阅读0次
接收到短信.png

1.cdmaNewSms

frameworks\opt\telephony\src\java\com\android\internal\telephony\RadioIndication.java

public void cdmaNewSms(int indicationType, CdmaSmsMessage msg) {
  mRil.processIndication(indicationType);

  if (RIL.RILJ_LOGD) mRil.unsljLog(RIL_UNSOL_RESPONSE_CDMA_NEW_SMS);

  mRil.writeMetricsNewSms(SmsSession.Event.Tech.SMS_CDMA, SmsSession.Event.Format.SMS_FORMAT_3GPP2);

  // todo: conversion from CdmaSmsMessage to SmsMessage should be contained in this class so
  // that usage of auto-generated HAL classes is limited to this file
  SmsMessage sms = SmsMessageConverter.newSmsMessageFromCdmaSmsMessage(msg);
  if (mRil.mCdmaSmsRegistrant != null) {
    mRil.mCdmaSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));  //mCdmaSmsRegistrant:Registrant
  }
}

2.notifyRegistrant

frameworks\base\core\java\android\os\Registrant.java

public void notifyRegistrant(AsyncResult ar) {
  internalNotifyRegistrant (ar.result, ar.exception);
}

3.internalNotifyRegistrant

frameworks\base\core\java\android\os\Registrant.java

void internalNotifyRegistrant (Object result, Throwable exception) {
  Handler h = getHandler(); //之前生成Registrant时的handler处理Message
  if (h == null) {
    clear();
  } else {
    Message msg = Message.obtain();
    msg.what = what;    
    msg.obj = new AsyncResult(userObj, result, exception);
    h.sendMessage(msg);
  }
}

4.handleMessage

frameworks\base\core\java\com\android\internal\util\StateMachine.java

private static class SmHandler extends Handler {
  public final void handleMessage(Message msg) {
    msgProcessedState = processMsg(msg);
  }
}

5.processMsg

frameworks\base\core\java\com\android\internal\util\StateMachine.java

private final State processMsg(Message msg) {
  while (!curStateInfo.state.processMessage(msg)) {
  }
}

6.processMessage

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

private class DeliveringState extends State {
  public boolean processMessage(Message msg) {
    switch (msg.what) {
      case EVENT_NEW_SMS:
        handleNewSms((AsyncResult) msg.obj);
        sendMessage(EVENT_RETURN_TO_IDLE);
        return HANDLED;
    }
  }
}

7.handleNewSms

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

private void handleNewSms(AsyncResult ar) {
  if (ar.exception != null) {
    loge("Exception processing incoming SMS: " + ar.exception);
    return;
  }

  int result;
  try {
    SmsMessage sms = (SmsMessage) ar.result;
    result = dispatchMessage(sms.mWrappedSmsMessage);
  } catch (RuntimeException ex) {
    loge("Exception dispatching message", ex);
    result = Intents.RESULT_SMS_GENERIC_ERROR;
  }

  // RESULT_OK means that the SMS will be acknowledged by special handling,
  // e.g. for SMS-PP data download. Any other result, we should ack here.
  if (result != Activity.RESULT_OK) {
    boolean handled = (result == Intents.RESULT_SMS_HANDLED);
    notifyAndAcknowledgeLastIncomingSms(handled, result, null);
  }
}

8.dispatchMessage

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

private int dispatchMessage(SmsMessageBase smsb) {
  return dispatchMessageRadioSpecific(smsb);
}

9.dispatchMessageRadioSpecific

frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\GsmInboundSmsHandler.java

protected int dispatchMessageRadioSpecific(SmsMessageBase smsb) {
  return dispatchNormalMessage(smsb);
}

10.dispatchNormalMessage

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

protected int dispatchNormalMessage(SmsMessageBase sms) {
  return addTrackerToRawTableAndSendMessage(tracker,
                tracker.getDestPort() == -1 /* de-dup if text message */);
}

11.addTrackerToRawTableAndSendMessage

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

protected int addTrackerToRawTableAndSendMessage(InboundSmsTracker tracker, boolean deDup) {
        switch(addTrackerToRawTable(tracker, deDup)) { //把短信存入raw表
        case Intents.RESULT_SMS_HANDLED:
            sendMessage(EVENT_BROADCAST_SMS, tracker); //发送Message
            return Intents.RESULT_SMS_HANDLED;

        case Intents.RESULT_SMS_DUPLICATED:
            return Intents.RESULT_SMS_HANDLED;

        case Intents.RESULT_SMS_GENERIC_ERROR:
        default:
            return Intents.RESULT_SMS_GENERIC_ERROR;
        }
}

12.processMessage

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

private class DeliveringState extends State {
  public boolean processMessage(Message msg) {
    case EVENT_BROADCAST_SMS:
      // if any broadcasts were sent, transition to waiting state
      InboundSmsTracker inboundSmsTracker = (InboundSmsTracker) msg.obj;
      if (processMessagePart(inboundSmsTracker)) { //如果长短信没有收到完整的信息,还是需要等待剩余信息
        transitionTo(mWaitingState);
      } else {
        // if event is sent from SmsBroadcastUndelivered.broadcastSms(), and
        // processMessagePart() returns false, the state machine will be stuck in
        // DeliveringState until next message is received. Send message to
        // transition to idle to avoid that so that wakelock can be released
        log("No broadcast sent on processing EVENT_BROADCAST_SMS in Delivering " + "state. Return to Idle state");
        sendMessage(EVENT_RETURN_TO_IDLE);
      }
      return HANDLED;
  }
}

13.processMessagePart

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

private boolean processMessagePart(InboundSmsTracker tracker) {
  if (!filterInvoked) {
    dispatchSmsDeliveryIntent(pdus, tracker.getFormat(), destPort, resultReceiver);
  }
  return true;
}

14.dispatchSmsDeliveryIntent

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

private void dispatchSmsDeliveryIntent(byte[][] pdus, String format, int destPort,
            BroadcastReceiver resultReceiver) {
  Intent intent = new Intent();
  intent.putExtra("pdus", pdus);
  intent.putExtra("format", format);

  if (destPort == -1) {
    intent.setAction(Intents.SMS_DELIVER_ACTION);
  } else{
    intent.setAction(Intents.DATA_SMS_RECEIVED_ACTION);
  }
  dispatchIntent(intent, android.Manifest.permission.RECEIVE_SMS,
                AppOpsManager.OP_RECEIVE_SMS, options, resultReceiver, UserHandle.SYSTEM);
}

15.dispatchIntent

frameworks\opt\telephony\src\java\com\android\internal\telephony\InboundSmsHandler.java

public void dispatchIntent(Intent intent, String permission, int appOp,
            Bundle opts, BroadcastReceiver resultReceiver, UserHandle user) {
  //发送广播
  mContext.sendOrderedBroadcastAsUser(intent, user, permission, appOp, opts,
                    resultReceiver, getHandler(), Activity.RESULT_OK, null, null);
}

16.上层应用收到广播

packages\apps\Mms\src\com\android\mms\transaction\PrivilegedSmsReceiver.java

public class PrivilegedSmsReceiver extends SmsReceiver {
  public void onReceive(Context context, Intent intent) {
    onReceiveWithPrivilege(context, intent, true);
  }
}

17.启动SmsReceiverService

packages\apps\Mms\src\com\android\mms\transaction\SmsReceiver.java

protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) {
  if (!privileged && intent.getAction().equals(Intents.SMS_DELIVER_ACTION)) {
            return;
  }

  intent.setClass(context, SmsReceiverService.class);
  intent.putExtra("result", getResultCode());
  beginStartingService(context, intent);
}

18.handleMessage

packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java

public void handleMessage(Message msg) {
  if (SMS_DELIVER_ACTION.equals(action)) {
    handleSmsReceived(intent, error);
  }
}

19.handleSmsReceived

packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java

private void handleSmsReceived(Intent intent, int error) {
  SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);
  String format = intent.getStringExtra("format");
  Uri messageUri = insertMessage(this, msgs, error, format); //插入数据库
  if (messageUri != null) { //弹出新信息的通知
    long threadId = MessagingNotification.getSmsThreadId(this, messageUri);
    // Called off of the UI thread so ok to block.
    Log.d(TAG, "handleSmsReceived messageUri: " + messageUri + " threadId: " + threadId);
    MessagingNotification.blockingUpdateNewMessageIndicator(this, threadId, false);
  }
}

20.insertMessage

packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java

private Uri insertMessage(Context context, SmsMessage[] msgs, int error, String format) {
  // Build the helper classes to parse the messages.
  SmsMessage sms = msgs[0];

  if (sms.getMessageClass() == SmsMessage.MessageClass.CLASS_0) {
    displayClassZeroMessage(context, sms, format);    //显示class0信息
    return null;
  } else if (sms.isReplace()) {
    return replaceMessage(context, msgs, error);
  } else {
    return storeMessage(context, msgs, error);
  }
}

21.storeMessage插入数据库

packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java

private Uri storeMessage(Context context, SmsMessage[] msgs, int error) {
  ContentResolver resolver = context.getContentResolver();
  Uri insertedUri = SqliteWrapper.insert(context, resolver, Inbox.CONTENT_URI, values);
}

相关文章

  • 被动信息收集

    title: 被动信息收集date: 2016-04-11 08:48:52tags: Kali第六章 被动信息收...

  • 信息收索加工及笔记整理

    在一回首间,才突然发现,原来我一生的种种努力,只是为了让周遭的人对我满意而已,为了博取他人的称许和微笑,我战战兢兢...

  • 中邮揽投收寄时订单渠道规则

    从1.2.2版本开始,邮政机构和速递机构在国内揽收和快速收寄模块进行预告信息收寄时,订单渠道选择的规则进行了统一,...

  • 信息对营销决策的价值

    任何营销活动,都离不开信息,没有信息,营销就很容易“失明”,寸步难行,在国家之间,都会有专门的情报机构负责信息的收...

  • 机器学习

    决策树 信息论 信息 信息即信源:表示一段信息,如文本、语音等等。 信源的不确定性:信源发出的消息不确定性越大,收...

  • 09-1高手是怎样吸收信息的

    信息吸收:高手都在巧用笔记提炼和吸收全部信息 1. 信息吸收是一个什么样的过程? 信息吸收的过程主要有三个步骤:收...

  • 复盘最简指南 助你打造高效模型

    复盘=收官+开启 收官=总结经验+构建模型开启=环境匹配+模型迭代 系统复盘 收集信息,持续验证阶段目标与预期结果...

  • (十)Node接口搭建——配置信息接口

    系统后面我们会用到信息、添加、删除这些接口,这一节我们主要的内容是配置信息接口。资金流水账主要信息有:创建时间、收...

  • [REITs情报]又分红!华安张江光大园REITs发钱啦!

    昨天刚说完平安广州广河REITs的分红信息,今天继续分享华安张江光大园REITs的分红信息∽ 持有的同学可以准备收...

  • 【读书笔记】《零秒思考:像麦肯锡精英一样思考》

    2.4 零秒思考和信息收集 虽说是“零秒思考”,但是如果手里掌握的信息不充分,那就必须在最短时限内进行调查和信息收...

网友评论

      本文标题:收信息

      本文链接:https://www.haomeiwen.com/subject/vixszqtx.html