当前位置:首页 > 行业动态 > 正文

Android系统短信源码解析,如何理解其工作原理?

Android 系统短信源码主要涉及 TelephonySmsManager 类,用于发送、接收和管理短信。具体实现包括权限检查、短信广播接收、短信内容处理等。

1、程序入口

确认应用入口:每一个应用程序都有各自的入口,对于Java编写的Android应用程序也不例外,确认短信app的入口是确认其在系统中对应源码的第一步。

获取主Activity名称:可以通过Android自带工具获取当前占据主界面的activity名称,使用Stackoverflow中的回答中提到的方法,如打Hierarchy View、直接打开Windows栏查看或使用dumpsys命令等。

2、程序功能分析

ActionBar的构造:在onCreateOptionsMenu函数中通过导入conversation_list_menu加载menu项目,设置了发送、搜索、设置、删除所有等按钮。

短信发送功能:发送短信的源代码如下:

 public void sendSMS(String phoneNumber, String message) {
         // 获取短信管理器
         android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();
         // 拆分短信内容(手机短信长度限制)
         List<String> divideContents = smsManager.divideMessage(message);
         for (String text : divideContents) {
             smsManager.sendTextMessage(phoneNumber, null, text, sentPI, deliverPI);
         }
     }

SmsManager的sendTextMessage函数:该函数用于发送短信,它调用了远程接口ISms中的sendText方法。

3、短信接收流程

从RILJ开始:根据之前分析phone应用的经验,最先接收到短信消息的是Modem,接着上报给RILJ,RILJ再通知到XXXTracker,之后由SmsManager作统一管理,最后到达App层。

处理接收到的短信:RILJ的processUnsolicited()方法负责处理接收到的短信消息,它会解析出消息包并将详细包通知到其注册者。

4、相关类和方法

IccSmsInterfaceManager类:该类实现了ISms接口,并提供了sendText方法用于发送短信。

SMSDispatcher类:这是一个抽象类,ImsSMSDispatcher类继承了该类并实现了具体的sendText方法。

单元表格

组件/模块 功能描述 关键方法/属性
SmsManager 管理短信发送和接收 sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)
IccSmsInterfaceManager 实现ISms接口,提供sendText方法 sendText(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent)
SMSDispatcher 抽象类,定义短信发送框架
ImsSMSDispatcher 继承SMSDispatcher,实现具体短信发送逻辑 sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, messageUri, callingPkg)
RILJ 与RILD及Modem交互,处理接收到的短信 processUnsolicited(response, ret)

相关问题与解答

1、如何修改Android系统短信应用的源码?

答:要修改Android系统短信应用的源码,首先需要下载对应的源码版本(如Android 11),然后找到Messaging源码位置(通常位于./packages/apps/Messaging下),可以按照平常的开发流程增加App目录和gradle文件,并将src和res等文件移植到相应目录下,还需要引入必要的依赖库和so库文件,通过mm命令进行编译生成apk并安装到手机上进行测试。

2、Android系统如何处理接收到的短信?

答:Android系统接收到短信后,会由RILJ的processUnsolicited()方法处理,该方法会解析出消息包并将详细包通知到其注册者,对于GSM短信,会创建SmsMessage对象并通过mGsmSmsRegistrant的notifyRegistrant方法通知注册者;对于CDMA短信和新广播短信也有相应的处理流程。

0