Android系统短信源码解析,如何理解其工作原理?
- 行业动态
- 2025-03-02
- 1
Telephony
和 SmsManager
类,用于发送、接收和管理短信。具体实现包括权限检查、短信广播接收、短信内容处理等。
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短信和新广播短信也有相应的处理流程。