短信接收流程

Platform:Android-7.1.1_r22


FW中短信接收流程

注:本文基于Android_7.1.1原生代码。


当有新短信时,RIL会收到RIL_UNSOL_RESPONSE_NEW_SMS消息。
private void processUnsolicited (Parcel p, int type) {
......
case RIL_UNSOL_RESPONSE_NEW_SMS: {
......
// 通知RIL_UNSOL_RESPONSE_NEW_SMS事件的监听者
if (mGsmSmsRegistrant != null) {
mGsmSmsRegistrant
.notifyRegistrant(new AsyncResult(null, sms, null));
}
break;
}
......
}

GsmInboundSmsHandler中会注册监听RIL_UNSOL_RESPONSE_NEW_SMS事件。
private GsmInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor,
Phone phone) {
......
phone.mCi.setOnNewGsmSms(getHandler(), EVENT_NEW_SMS, null);
......
}

BaseCommands.java
public void setOnNewGsmSms(Handler h, int what, Object obj) {
mGsmSmsRegistrant = new Registrant (h, what, obj);
}

GsmInboundSmsHandler收到RIL的通知后,在其父类InboundSmsHandler中进行处理。
InboundSmsHandler是一个状态机,此类的作用是将收到的短信存储后再通过广播发出去,
并发送相应给短信中心,发送广播后,就会删除短信内容。如果向短信中心发送相应后,
还未发送广播时,程序就crash了,在程序再次启动后会重新发送广播。

TODO:补充状态机流程

private class IdleState extends State {
......
public boolean processMessage(Message msg) {
log("IdleState.processMessage:" + msg.what);
if (DBG) log("Idle state processing message type " + msg.what);
switch (msg.what) {
case EVENT_NEW_SMS:
case EVENT_INJECT_SMS:
case EVENT_BROADCAST_SMS:
// 这里并没有对消息进行处理,而是把消息推迟,到Delivering状态再进行处理
deferMessage(msg);
transitionTo(mDeliveringState);
return HANDLED;
......
}
}

在退出IdleState时会获取mWakeLock锁。
public void exit() {
mWakeLock.acquire();
if (DBG) log("acquired wakelock, leaving Idle state");
}


接下来在DeliveringState中处理EVENT_NEW_SMS事件。

private class DeliveringState extends State {
......
public boolean processMessage(Message msg) {
log("DeliveringState.processMessage:" + msg.what);
switch (msg.what) {
case EVENT_NEW_SMS:
// handle new SMS from RIL
handleNewSms((AsyncResult) msg.obj);
sendMessage(EVENT_RETURN_TO_IDLE);
return HANDLED;
......
}
}


private void handleNewSms(AsyncResult ar) {
......
try {
SmsMessage sms = (SmsMessage) ar.result;
result = dispatchMessage(sms.mWrappedSmsMessage);
} catch (RuntimeException ex) {
......
}

// 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);
}
}
 

转载于:https://my.oschina.net/igiantpanda/blog/2222663

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值