收信息

接收到短信.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時(shí)的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); //發(fā)送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) {
  //發(fā)送廣播
  mContext.sendOrderedBroadcastAsUser(intent, user, permission, appOp, opts,
                    resultReceiver, getHandler(), Activity.RESULT_OK, null, null);
}

16.上層應(yīng)用收到廣播

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.啟動(dòng)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); //插入數(shù)據(jù)庫
  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插入數(shù)據(jù)庫

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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洒忧,隨后出現(xiàn)的幾起案子蝴韭,更是在濱河造成了極大的恐慌,老刑警劉巖熙侍,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件万皿,死亡現(xiàn)場離奇詭異,居然都是意外死亡核行,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門惩系,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人擦剑,你說我怎么就攤上這事。” “怎么了售担?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵骑素,是天一觀的道長。 經(jīng)常有香客問我创橄,道長醉蚁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任惑畴,我火速辦了婚禮到踏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菩彬。我一直安慰自己惨恭,他們只是感情好锉罐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布侨舆。 她就那樣靜靜地躺著臭笆,像睡著了一般帜讲。 火紅的嫁衣襯著肌膚如雪蚀苛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天辨嗽,我揣著相機(jī)與錄音洲押,去河邊找鬼送朱。 笑死争群,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冲泥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼漫试,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驾荣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缅阳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向族,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年拜效,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片各谚。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紧憾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昌渤,到底是詐尸還是另有隱情赴穗,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布膀息,位于F島的核電站般眉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏履婉。R本人自食惡果不足惜煤篙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一斟览、第九天 我趴在偏房一處隱蔽的房頂上張望毁腿。 院中可真熱鬧,春花似錦苛茂、人聲如沸已烤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胯究。三九已至,卻和暖如春躁绸,著一層夾襖步出監(jiān)牢的瞬間裕循,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工净刮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剥哑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓淹父,卻偏偏與公主長得像株婴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子暑认,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,699評論 0 3
  • 1.makeDefaultPhones frameworks\opt\telephony\src\java\com...
    墜葉飄香閱讀 723評論 0 0
  • 1. 應(yīng)用進(jìn)程 從點(diǎn)擊撥號按鈕流程說起packages/apps/Dialer/src/com/android/d...
    小的橘子閱讀 4,165評論 3 1
  • 文/青楓曦雨 誰說相思無處寄 寄一曲紅顏殘殤高歌 舞一段羞澀嬌舞 把相思寄給高空明月 邀君共青舞,飲美酒 如此座哩,可...
    青楓曦雨閱讀 356評論 0 2
  • 各位小伙伴徒扶,大家晚上好,還記得我們小時(shí)候每到大城市根穷,就被金碧輝煌的燈光吸引了酷愧、陶醉了,沒錯(cuò)缠诅,我就是用燈光點(diǎn)亮一座城...
    Sherry秋閱讀 159評論 0 0