`

android sms接收流程(ril分析)

 
阅读更多

短信接收是从ril.cpp文件通过socket与RIL.java的socket交流,当ril.cpp收到短信后处理完成后会通过socket发送字节流给上层的RIL.java,而在RIL.java中有Receiver架构(该架构主要是一条线程)在不断监听,

 

Receiver架构代码:

class RILReceiver implements Runnable {

        byte[] buffer;

        RILReceiver() {

            buffer = new byte[RIL_MAX_COMMAND_BYTES];

        }

        public void

        run() {

            int retryCount = 0;

            try {
                for (;;) {

                    LocalSocket s = null;

                    LocalSocketAddress l;

                    try {

                        s = new LocalSocket();

                        l = new LocalSocketAddress(SOCKET_NAME_RIL,

                        LocalSocketAddress.Namespace.RESERVED);

                        s.connect(l);

                    } catch (IOException ex) {

                        try {

                            if (s != null) {

                                s.close();

                            }

                        } catch (IOException ex2) {

                            // ignore failure to close after failure to connect

                        }

                        // don't print an error message after the the first time

                        // or after the 8th time

                        if (retryCount == 8) {

                            Log.e(LOG_TAG,

                            "Couldn't find '" + SOCKET_NAME_RIL

                            + "' socket after " + retryCount

                            + " times, continuing to retry silently");

                        } else if (retryCount > 0 && retryCount < 8) {

                            Log.i(LOG_TAG,

                            "Couldn't find '" + SOCKET_NAME_RIL

                            + "' socket; retrying after timeout");

                        }

                        try {

                            Thread.sleep(SOCKET_OPEN_RETRY_MILLIS);

                        } catch (InterruptedException er) {

                        }

                        retryCount++;

                        continue;

                    }

                    retryCount = 0;

                    mSocket = s;

                    Log.i(LOG_TAG, "Connected to '" + SOCKET_NAME_RIL
                            + "' socket");

                    int length = 0;

                    try {

                        InputStream is = mSocket.getInputStream();

                        for (;;) {

                            Parcel p;

                            length = readRilMessage(is, buffer);

                            if (length < 0) {

                                // End-of-stream reached

                                break;

                            }

                            p = Parcel.obtain();

                            p.unmarshall(buffer, 0, length);

                            p.setDataPosition(0);

                            // Log.v(LOG_TAG, "Read packet: " + length +
                            // " bytes");

                            processResponse(p);

                            p.recycle();

                        }

                    } catch (java.io.IOException ex) {

                        Log.i(LOG_TAG, "'" + SOCKET_NAME_RIL
                                + "' socket closed",

                        ex);

                    } catch (Throwable tr) {

                        Log.e(LOG_TAG, "Uncaught exception read length="
                                + length +

                                "Exception:" + tr.toString());

                    }

                    Log.i(LOG_TAG, "Disconnected from '" + SOCKET_NAME_RIL

                    + "' socket");

                    setRadioState(RadioState.RADIO_UNAVAILABLE);

                    try {

                        mSocket.close();

                    } catch (IOException ex) {

                    }

                    mSocket = null;

                    RILRequest.resetSerial();

                    // Clear request list on close

                    synchronized (mRequestsList) {

                        for (int i = 0, sz = mRequestsList.size(); i < sz; i++) {

                            RILRequest rr = mRequestsList.get(i);

                            rr.onError(RADIO_NOT_AVAILABLE, null);

                            rr.release();

                        }

                        mRequestsList.clear();

                    }

                }
            } catch (Throwable tr) {

                Log.e(LOG_TAG, "Uncaught exception", tr);

            }

        }

    }

 

因此从代码可以看出获取到短信消息后经过一系列地分析然后提交给processResponse(p); 方法处理,处理过程中会有两种response,一种是主动上报,比如网络状态,短信,来电等都不需要经过请求,用unsolicited词语专门描述,另一种才是真正意义上的response,也就是命令的响应用solicited描述。那接收短信就是属于unsolicited,跳到processUnsolicited (Parcel p)方法,查看该方法可得出会继续触发以下方法mSMSRegistrant.notifyRegistrant(new AsyncResult(null, sms, null)); 追溯该方法对象的创建,最后发现该方法设置handler的源头是在:SMSDispatcher类里

clip_image004

该类做了一件重要的事:给Command Interface设置handler的处理方法,就是当接收到短信后触发mSMSRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));方法,然后回调调用之前传入的handler,接着在handler里面处理短信消息。

mCm.setOnNewSMS(this, EVENT_NEW_SMS, null);

mCm.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);

mCm.setOnIccSmsFull(this, EVENT_ICC_FULL, null);

mCm.registerForOn(this, EVENT_RADIO_ON, null);

 

handler处理接收到的短信消息:

@Override
    public void handleMessage(Message msg) {

        AsyncResult ar;

        switch (msg.what) {

        case EVENT_NEW_SMS:

            // A new SMS has been received by the device

            if (Config.LOGD) {

                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;

        }

    }

 

int result = dispatchMessage(sms.mWrappedSmsMessage); 该段会通过子类(GsmSMSDispatcher)的dispatchMessage方法处理。经一系列的判断处理最后普通短信将交给dispatchPdus(pdus);这个方法处理。

 

protected void dispatchPdus(byte[][] pdus) {

Intent intent = new Intent(Intents.SMS_RECEIVED_ACTION);

intent.putExtra("pdus", pdus);

dispatch(intent, "android.permission.RECEIVE_SMS");

}

void dispatch(Intent intent, String permission) {

// Hold a wake lock for WAKE_LOCK_TIMEOUT seconds, enough to give any

// receivers time to take their own wake locks.

mWakeLock.acquire(WAKE_LOCK_TIMEOUT);

mContext.sendOrderedBroadcast(intent, permission, mResultReceiver,

this, Activity.RESULT_OK, null, null);

}

 

最后,我们可以看出这个方法将短信通过顺序广播播放出去(action是SMS_RECEIVED_ACTION),无论广播是否被中断最后都会调用mResultReceiver,这里会将已读或未读的状态告诉给对方。如果短信广播中间没有受到終止,那么接下来的流程是:PrivilegedSmsReceiver类接收到android.provider.Telephony.SMS_RECEIVED的请求然后调用 intent.setClass(context, SmsReceiverService.class); 启动SmsReceiverService服务类来处理短信并保存短信。

 

分享到:
评论

相关推荐

    Ril_SO.rar_RIL android_RIL for android_android_android智能手机_ril.s

    2. **短信服务**:RIL负责短信的发送和接收,包括SMS-PDU和SMS-TP协议的处理。短信的编码、解码以及发送至正确目的地都是RIL的工作范畴。 3. **数据连接管理**:RIL控制数据连接的建立、断开,包括2G、3G、4G、5G等...

    详解Android4.4 RIL短信接收流程分析

    本篇文章将详细解析Android 4.4版本中RIL如何处理短信接收的流程。 1. **RIL接收到短信的初步处理**: 当手机接收到短信时,RIL会通过无线电控制器(Radio Controller,ATC)接收到AT命令`+CMT:`,这表明有新的...

    reference-ril.rar_android_android M 原生RIL库_reference-ril_ril-ref

    - **ril_sms.c/h**:负责短信服务,包括发送、接收和存储短信。 - **ril_network.c/h**:网络连接和数据业务的处理。 四、调试与开发 对于开发者而言,理解并使用reference-ril库进行RIL开发至关重要。开发者可以...

    Quectel-Android-RIL-Driver-V3.6.22

    3. **短信处理**:提供短信的发送和接收功能,支持SMS协议,满足用户的基本通信需求。 4. **网络注册**:自动检测和注册到可用的网络,确保设备始终保持连接状态。 5. **位置服务**:通过GPS和其他定位技术,提供...

    Android Ril

    5. **短消息服务(SMS)**:RIL处理短信的发送和接收,包括PDU模式和Text模式的短信。 6. **位置信息**:RIL还可以获取手机的位置信息,例如通过GPS、蜂窝塔三角定位等方式。 7. **网络状态监控**:RIL持续监控...

    Android安全攻防指南_攻击RIL无线接口层_编程案例解析实例详解课程教程.pdf

    这包括检查 RIL daemon 如何解析接收到的 SMS 数据包,验证其是否能正确处理异常情况,以及确保在处理过程中有适当的错误检测和边界条件检查。 为了提高 Android 设备的安全性,安全测试是必不可少的步骤。这不仅...

    Android RIL introduce

    Android RIL,全称为Radio Interface Layer,是Android操作系统中至关重要的一个组件,它充当着操作系统与无线通信硬件之间的桥梁。RIL负责处理所有与移动网络相关的底层通信,包括蜂窝数据、电话呼叫、短信服务以及...

    Android RIL详解

    ### Android RIL详解 ...通过对RIL各组件的理解及其初始化流程的深入分析,我们可以更好地理解Android中无线通信的基本原理和技术细节。这种深入的技术洞察对于优化移动设备上的网络通信性能至关重要。

    Android Ril 解析

    4. `reference-cdma-sms`和`reference-ril`子目录包含CDMA短信和通用RIL参考实现,`reference-ril.c`主要负责与Modem的交互,使用`atchannel.h/cpp`等文件提供的AT命令通道来读写Modem数据。 理解Android RIL的工作...

    Ril资料[ril.h、ril.lib] Mobile

    在Android系统中,RIL扮演着处理底层通信任务的角色,如初始化网络连接、拨打电话、发送短信等。本文将深入探讨RIL驱动接口及其在移动开发中的作用。 首先,`ril.h`文件是RIL驱动接口的头文件,它包含了所有RIL相关...

    Framework层短信收发流程介绍

    #### SMS接收流程 1. **接收事件**:短信接收流程从`RIL.java`开始,其中定义了多个事件,例如`RIL_UNSOL_RESPONSE_NEW_SMS`用于GSM短信接收,`RIL_UNSOL_RESPONSE_CDMA_NEW_SMS`用于CDMA短信接收。 2. **解码处理...

    android 电话流程

    在Android系统中,电话流程是一个复杂且重要的过程,它涉及到多个系统组件的交互。这篇文档主要针对Android初学者,旨在详细解析电话流程的工作原理。在Android平台上,电话管理由电信框架(Telephony Framework)...

    android短信收发流流程

    本文将深入探讨Android短信收发的流程,包括发送、接收、处理以及相关的API使用。 一、短信发送流程 1. 用户在短信应用中输入收件人和消息内容。 2. 应用调用`SmsManager`类提供的方法,例如`sendTextMessage()`,...

    Android Telephony 概述分析

    Android Telephony 概述分析 Android Telephony 是一个核心组件,负责处理移动设备的电话、短信和SIM卡功能。在Android系统中,它构建了一个复杂的架构,与硬件接口(RIL,Radio Interface Layer)紧密协作,确保...

    Android的Telephony框架

    本文将深入探讨Android Telephony框架的结构、工作原理以及相关的源码分析。 1. **TelephonyManager服务** Android系统的TelephonyManager服务是应用程序与电话功能交互的主要接口。它提供了多种方法,如获取运营...

    RIL.zip_RIL_The Actual_mobile ril

    5. **短消息服务**(SMS):发送和接收短信。 描述中的“With this class you can read out the actual cell of your mobile and other infos”表明,这个`RIL.cs`文件可能提供了访问RIL接口的类,允许开发者获取...

    android phone网上资料

    1. **Android SDCard UnMounted 流程分析:** SD卡在Android设备中作为外部存储,用于扩展手机的存储空间。当SD卡被卸载时,可能是因为用户移除SD卡或系统进行维护操作。分析这一流程有助于理解如何正确处理SD卡的...

    Android多媒体应用——短信收发

    - 在`AndroidManifest.xml`中注册`BroadcastReceiver`,并添加`&lt;receiver&gt;`标签,设置`android.permission.RECEIVE_SMS`权限,以允许接收短信。 - 使用`IntentFilter`指定`ACTION_SMS_RECEIVED`,这样当有新短信...

    10_Android的电话.pdf

    根据给定的文件信息,我们将深入探讨Android电话部分的核心组件及其功能实现,特别是关于RIL层的详细解析。 ### 第一部分:Android电话部分的结构 Android的电话功能,即Telephony,是其作为智能移动设备平台的...

Global site tag (gtag.js) - Google Analytics