一 初始化

手机开机初始化调用GSMPhone 构造函数。

GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode)

创建 mSMS = new GsmSMSDispatcher(this);

该类继承于SMSDispatcher。类SMSDispatcher中构造函数中初始化了 短信的消息

mCm.setOnNewSMS(this, EVENT_NEW_SMS, null);

mCm.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);

mCm.setOnIccSmsFull(this, EVENT_ICC_FULL, null);

handleMessage定义了sms的消息处理函数

public void handleMessage(Message msg) {

……

case EVENT_NEW_SMS:

……

}

mSimSmsIntManager = new SimSmsInterfaceManager(this);

SimSmsInterfaceManager继承于IccSmsInterfaceManager 为Isms.stub的实现类.

在IccSmsInterfaceManager 类实现了 Isms.adil. 中定义的方法,以实现远程调用。

二 短信发送

短信发送调用接口

SmsManager sms = SmsManager.getDefault();

sms.sendTextMessage(string1, null, string2, p, null);

sendTextMessage 调用 sendRawPdu。

在sendRawPdu中 创建了

ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));

通过aidl接口,实例化 IccSmsInterfaceManager. 调用 smsDispatcher.java中

protected void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent,

PendingIntent deliveryIntent) 函数。

而后通过stub 接口调用sendSMS 接口。

RIL.java 中 sendSMS

public void

sendSMS (String smscPDU, String pdu, Message result) {

RILRequest rr

= RILRequest.obtain(RIL_REQUEST_SEND_SMS, result);

…..

send(rr);

}

发送 RIL_REQUEST_SEND_SMS 的 Request 请求到rild层。

Rild与modem之间联系与其它应用类似,不再重复。

三 短信的接收

Modem 与rild之间不再重复。从ril层中收到消息开始。

Ril.java中 rilReceiver 收到信短信消息processResponse(p); 收到短信属于主动上报

调用processUnsolicited函数。

private void processUnsolicited (Parcel p) {

………

case RIL_UNSOL_RESPONSE_NEW_SMS: ret = responseString(p); break;

…….

switch(response) {

case RIL_UNSOL_RESPONSE_NEW_SMS: {

…….

SmsMessage sms;

…….

sms = SmsMessage.newFromCMT(a);

if (mSMSRegistrant != null) {

mSMSRegistrant

.notifyRegistrant(new AsyncResult(null, sms, null));

}

break;

}

…….

}

mSMSRegistrant 调用到Registrant.java文件中notifyRegistrant方法。

internalNotifyRegistrant 调用sendMessage 方法。

public void notifyRegistrant(AsyncResult ar)

{

internalNotifyRegistrant (ar.result, ar.exception);

}

internalNotifyRegistrant 收到消息后将消息发送到消息队列。

/*package*/ void

internalNotifyRegistrant (Object result, Throwable exception)

{

Handler h = getHandler();

if (h == null) {

clear();

} else {

Message msg = Message.obtain();

msg.what = what;

msg.obj = new AsyncResult(userObj, result, exception);

h.sendMessage(msg);

}

}

sendMessage 依次调用Handler.java 文件中 sendMessage->sendMessageDelayed-> sendMessageAtTime 在 sendMessageAtTime中将该短信消息加入到 消息队列中。

sent = queue.enqueueMessage(msg, uptimeMillis);

public boolean sendMessageAtTime(Message msg, long uptimeMillis)

{

boolean sent = false;

MessageQueue queue = mQueue;

if (queue != null) {

msg.target = this;

sent = queue.enqueueMessage(msg, uptimeMillis);

}

else {

RuntimeException e = new RuntimeException(

this + " sendMessageAtTime() called with no mQueue");

Log.w("Looper", e.getMessage(), e);

}

return sent;

}

Looper.java 中loop方法。用于将消息队列中消息dispatch出去。
public static final void loop() {

Looper me = myLooper();

MessageQueue queue = me.mQueue;

while (true) {

Message msg = queue.next(); // might block

//if (!me.mRun) {

// break;

//}

if (msg != null) {

if (msg.target == null) {

// No target is a magic identifier for the quit message.

return;

}

if (me.mLogging!= null) me.mLogging.println(

">>>>> Dispatching to " + msg.target + " "

+ msg.callback + ": " + msg.what

);

msg.target.dispatchMessage(msg);

if (me.mLogging!= null) me.mLogging.println(

"<<<<< Finished to " + msg.target + " "

+ msg.callback);

msg.recycle();

}

}

}

dispatchMessage函数调用当前handle的消息处理函数。

public void dispatchMessage(Message msg) {

if (msg.callback != null) {

handleCallback(msg);

} else {

if (mCallback != null) {

if (mCallback.handleMessage(msg)) {

return;

}

}

handleMessage(msg);

}

}

调用到smsDispatcher.java中

public void handleMessage(Message msg) {

AsyncResult ar;

switch (msg.what) {

case EVENT_NEW_SMS:

………

}

}

从而实现了对新收到的短信的处理。

android短信的接收和发送处理的更多相关文章

  1. Android 短信广播接收相关问题

    本人是Android新手,最近做了一个关于监听手机短信功能的应用,我在网上看资料了解到广播分为有序广播和无序广播,有序广播:无序广播又称普通广播,其中的利弊我也一时没搞清楚,我用的是有序广播实现的,具 ...

  2. Android之发送短信和接收验证码

      最近项目需求需要发送短信和接收验证码并将验证码显示在输入框中 以下是我的记录    前提---权限     <uses-permission android:name="andro ...

  3. Android--发送短信,并且通知发送方

    1.发送短信涉及到权限,我们需要把权限加上 2.当我们发送短信时,不管发送是否成功,接收方是否接收到,系统都会发送广播 3.这时我们注册广播去接收一下就可以了 4.布局文件很简单,里面就两个EditT ...

  4. Android短信监听实现,及Android4.4之后短信机制变更

    前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个: 1.监听短信并获取短信内容上传服务器: 2.从服务器获取短信内容,发送出去    按照传统的思路,监听短信我们有两种方式:第一种是使用广播 ...

  5. Android短信收到,语音播报

    发送短信功能界面 /** * 发送短信Demo * * @description: * @author ldm * @date 2016-4-22 上午9:07:53 */ public class ...

  6. android短信拦截

    广播分2种,无序广播和有序广播.可以理解为散列和队列广播. 首先无序广播,不能中断,分发机制有点类似散列发送.这种广播的的发送为:context.sendBroadcast这种广播是不能中断的,请看A ...

  7. Android短信发送器(2)

    在上一篇的<Android短信发送器>当中.发送功能并不完好.当发送内容超过限定字数时,短信就会发送失败,此时就须要推断内容是否超过限制,假设不超过限制.就直接发送,反之.则对其进行处理再 ...

  8. 【mob】Android短信验证+源码

    在很多的应用当中,都涉及到了短信验证的功能,比如在注册或者找回密码的时候,那么我们如何通过第三方的平台来完成这个功能呢? 本面博文就实现短信验证,来做一个小的栗子. 第一步-下载开发包 第二步-将SD ...

  9. Android 短信验证码控件

    Android 短信验证码控件,便于项目中使用统一样式,统一提示改动.个人觉得挺好用的 <span style="font-size:18px;">public cla ...

随机推荐

  1. linux-LINUX试题

    ylbtech-doc:linux-LINUX试题 LINUX试题 1.A,LINUX试题返回顶部 01.{Linux题目}在使用匿名登录ftp时,用户名为(  )? (选择1项) A) login ...

  2. 炮兵阵地(POJ 1185状压dp)

    题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...

  3. bjfu1099 度度熊大战僵尸

    这也是2011年百度之星的一道题. 这题我就是乱搞搞过的,打代码之前自己心里也没底,不知道能不能过的. 我的做法很简单,就是按时间顺序依次构造能杀死的僵尸血量,找到第k小的.构造的方法也很暴力:对t时 ...

  4. Jmeter教程

    博客园 http://www.cnblogs.com/yangxia-test/category/431240.html 1)分析能力没有LoadRunner详细 2)jmeter不支持IP欺骗,而L ...

  5. 动态执行linq 语句 NLinq

    using Evaluant.NLinq.Memory;using System.Collections.Generic;using Evaluant.NLinq;using System.Colle ...

  6. Clang Language Extensions

    Xcode 本文是自<Clang Language Extensions> 中选取部分与 Objective-C 相关的内容翻译,由于作者水平有限,如存在理解错误或翻译不到位的地方,还请指 ...

  7. BBED的安装

    BBED是Block Browser EDitor的缩写,只有linux/unix版本,没有windows版本. 11g中默认是不带bbed的,如果要使用,可以在10g中拷贝过来,然后再进行编译使用. ...

  8. 树莓派I2C连接18B20

    按图连接设备 载入模块 sudo modprobe w1-gpio sudo modprobe w1-therm cd /sys/bus/w1/devices/ 显示结果 ls pi@raspberr ...

  9. nyoj 10 skiing(记忆化搜索)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  10. jQuery基础学习4——jQuery容错性

    使用jQuery选择器不仅比使用传统的getElementById()和getElementsByTagName()函数简洁得多,而且还能避免某些错误. <script type="t ...