Android4.2

在Android4.0中,Phone应用的Application类PhoneApp的onCreate方法中调用了

           PhoneFactory.makeDefaultPhones(this);

而在4.2中此方法被移到了PhoneGlobals中,PhoneGlobals类继承自ContextWrapper。

在PhoneFactory的makeDefaultPhone方法中初始化了RIL类的静态对象sCommandsInterface与Phone的静态对象sProxyPhone。

RIL构造时判断出手机网络良好就会启动一个线程,线程的Runnable对象是RILReceiver的对象。在run方法中构建Sockect并向下层发起连接

                    s = new LocalSocket();l = new LocalSocketAddress(SOCKET_NAME_RIL,LocalSocketAddress.Namespace.RESERVED);s.connect(l);

如果连接不上每隔4秒重连一次。如果连接正常,则获取流,调用readRilMessage(is, buffer)方法返回除去开头4个字节外能从流中获取的字节数并把获取的字节存于8k大小限制的buffer中,如果读不到任何字节返回-1。如果返回值为-1,则跳出处理流程,重新进入for循环,否则把获取的字节存于Parcel对象中并调用processResponse(p)处理获取到的数据。

    private voidprocessResponse (Parcel p) {int type;type = p.readInt();if (type == RESPONSE_UNSOLICITED) {processUnsolicited (p);} else if (type == RESPONSE_SOLICITED) {processSolicited (p);}releaseWakeLockIfDone();}

接下来读取4个代表类型的字节。走if流程processUnsolicited (p)。

接下来再读取4个字节的int数据代表事件类型,接收短信走RIL_UNSOL_RESPONSE_NEW_SMS(1003)流程

case RIL_UNSOL_RESPONSE_NEW_SMS: ret =  responseString(p); break;
    protected ObjectresponseString(Parcel p) {String response;response = p.readString();return response;}

获取数据中的String后继续处理

            case RIL_UNSOL_RESPONSE_NEW_SMS: {if (RILJ_LOGD) unsljLog(response);// FIXME this should move up a layerString 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;

如上:mGsmSmsRegistrant定义在Ril的父类中通过下方法赋对象

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

mGsmSmsRegistrant的notifyRegistrant方法把得到数据用handler传递出去了,接下来跟踪handler是哪个类传过来的。

在构造Phone对象时

                        sProxyPhone[i] = new YZPhoneProxy(new TDPhone(context,sCommandsInterface[i], sPhoneNotifier[i]));

可以看出Ril对象赋给了TDPhone对象,TDPhone对象赋给了YZTPhoneProxy对象。查看TDPhone对象的构造发现其调用了其父类GSMPhone的构造,在GSMPhone构造方法中初始化了SMSDispatcher对象

  mSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);

在GsmSMSDispatcher的构造方法中调用了setOnNewGsmSms方法把自己注册在Ril.java里了。

    public GsmSMSDispatcher(PhoneBase phone, SmsStorageMonitor storageMonitor,SmsUsageMonitor usageMonitor) {super(phone, storageMonitor, usageMonitor);mDataDownloadHandler = new UsimDataDownloadHandler(mCm);mCm.setOnNewGsmSms(this, EVENT_NEW_SMS, null);mCm.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);mCm.setOnNewGsmBroadcastSms(this, EVENT_NEW_BROADCAST_SMS, null);}

也就是说Ril类里接收普通短信的数据最终传到了GsmSMSDispatcher类的handleMessage方法里,不过GsmSMSDispatcher的handleMessage没处理,而是在其父类SMSDispatcher的handleMessage方法中处理的。

        case EVENT_NEW_SMS:// A new SMS has been received by the deviceif (false) {Log.d(TAG, "New SMS Message Received");}SmsMessage sms;ar = (AsyncResult) msg.obj;if (ar.exception != null) {Log.e(TAG, "Exception processing incoming SMS. Exception:" + ar.exception);return;}sms = (SmsMessage) ar.result;try {int result = dispatchMessage(sms.mWrappedSmsMessage);if (result != Activity.RESULT_OK) {// RESULT_OK means that message was broadcast for app(s) to handle.// Any other result, we should ack here.boolean handled = (result == Intents.RESULT_SMS_HANDLED);notifyAndAcknowledgeLastIncomingSms(handled, result, null);}} catch (RuntimeException ex) {Log.e(TAG, "Exception dispatching message", ex);notifyAndAcknowledgeLastIncomingSms(false, Intents.RESULT_SMS_GENERIC_ERROR, null);}break;

调用了GsmSMSDispatcher中的dispatchMessage(SmsMessageBase smsb)方法,在此方法中对USIM做了其他处理。判断了系统属性是否允许接收短信,对接收短信的限制可以在这个方法里做。最后调用了SMSDispatcher的dispatchNormalMessage(smsb)方法,在此方法又根据解析数据的来的信息判断流程,最后走到dispatchPdus(byte[][] pdus)方法,此方法发送广播

    protected void dispatchPdus(byte[][] pdus) {Intent intent = new Intent(Intents.SMS_RECEIVED_ACTION);intent.putExtra("pdus", pdus);intent.putExtra("format", getFormat());dispatch(intent, RECEIVE_SMS_PERMISSION);}

下面就是应用层接收广播与处理得到的数据过程了:

接收广播的是SmsReceiver的子类PrivilegedSmsReceiver,最后又把接收到的Intent传递到SmsReceiverService.class中去处理了

                } else if (SMS_RECEIVED_ACTION.equals(action)) {handleSmsReceived(intent, error);
    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 (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE) || LogTag.DEBUG_SEND) {SmsMessage sms = msgs[0];Log.v(TAG, "handleSmsReceived" + (sms.isReplace() ? "(replace)" : "") +" messageUri: " + messageUri +", address: " + sms.getOriginatingAddress() +", body: " + sms.getMessageBody());}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);}}

handleSmsReceived方法把收到的数据存到数据库里并发收到信息的通知。

SMS注册与接收短信相关推荐

  1. Android接收短信和发送短信

    一.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  2. android sms 接收短信,Android SMS 短信操作

    android的短信保存在短信库里,但并提供类似Contacts的公开的Content Provider方便操作.这里简单的介绍下:android中的短信信息保存在/data/data/com.and ...

  3. Android从普通发送和接收短信到对短信进行拦截

    概述: 说实话,关于Android中对短信的一些相关操作是一个比较入门的东西.那我现在还要来写这一篇博客的原因只是因为现在开发中有相关内容,而又想将这些东西分享给更多的人来学习,同时在以后对Andro ...

  4. Android接收短信

    既然写了发送短信,那么接收短信肯定也是一定要写的了. 接收短信主要是广播的接收,每当Andorid接收到一条新短信时都会产生一个广播,我们的程序通过捕获这个广播,就能获取短信了. 依旧是权限问题:&l ...

  5. JAVA实现注册登陆的短信验证

    一.找到一个短信API服务数据接口 使用短信api接口服务我这里是使用一个第三方的接口服务(步骤需要不是打广告). 1.获取短信接口的Appkey程序钥匙. https://www.juhe.cn/ ...

  6. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容

    在上一篇文章 Android简单实现BroadCastReceiver广播机制 中简单的实现了一个广播机制,这里利用BroadCarstRecevier实现一个接收短信并显示内容的案例,当然至于接收到 ...

  7. android app 短信接收,Android创建简单发送和接收短信应用

    本文实例为大家分享了Android创建发送和接收短信应用的简单实现过程,供大家参考,具体内容如下 一.接收短信 项目的结构如下:一个简单的接收和发送短信的功能 1.定义一个接收短信的广播:当手机接收到 ...

  8. Python3,5句话实现自动接收短信提醒

    平时由于工作原因,会错过一些邮件, 为了避免这种事情的发生,小鱼搞了一个自动接收短信的服务, 这样就不会在错误重要的邮件喽. 接下来我们就一起来看看吧 TWilio平台注册 代码实现 TWilio平台 ...

  9. BroadcastReceiver使用之一(常驻BroadcastReceiver接收短信)

    从 "您有一条短信"这个最常见的手机服务开始,本程序设计了一个可以接收短信的程序,将捕捉到的短信广播信息,拆解为可阅读的消息正文,而后以Toast的方式输出至手机. 在Androi ...

最新文章

  1. springboot + rabbitmq 用了消息确认机制,感觉掉坑里了
  2. [日推荐]『保养汽车』爱车的专职管家
  3. VC++中把一个对话框最小化到托盘
  4. 思维导图一定要用计算机来完成吗,计算机绘制思维导图有什么优势
  5. 使用Eclipse构建Maven项目 (step-by-step)
  6. 你的密码安全吗?——索尼事件的教训
  7. python 小数乘法_《包装》——小数乘法
  8. OptiCoupe 6:光学切割面板和型材切割优化[OptiCut]
  9. Vcenter无法登录,“根证书错误”,“签名证书无效”
  10. 第一篇:零基础入门金融风控之风控指标体系清单
  11. 优质数据平台如何打造?从网易云音乐看内容生态的运营法则
  12. conventional path export与direct path export
  13. 浮点型数据的输入和输出(C语言)
  14. 音频声音太小怎么调大?
  15. html怎么吧图片设置成背景音乐,如何把照片做成视频并添加音乐
  16. 找到出问题的地方了啊
  17. git 删除远端分支
  18. 图像识别python
  19. 14.二维数组:什么是二维数组???
  20. c++ ~ std::wstring 转LPWSTR

热门文章

  1. 【CodeForces】896 B. Ithea Plays With Chtholly
  2. 浏览器中调试web你知道吗?
  3. 常见java空指针异常
  4. 如何在Axure中使用Iconfont图标字体
  5. Django 文档 -- 记录我的Django学习之旅
  6. git.exe pull -v --progress “scanpenmodular“fatal: detected dubious ownership in repository at ‘
  7. Smarter TSM 工具集介绍
  8. ARDUINO:控制两台步进电机同步运转
  9. 15.4 真实感图形——纹理映射
  10. ele ui 清空选项和重新校验