在Android系统中,MMS(Multimedia Messaging Service)即多媒体短信服务,允许用户发送和接收包含文本、图片、音频和视频等内容的短信。本文将详细阐述Android MMS的接收信息流程,包括短信和彩信的接收机制。
我们关注的是短信的接收。当手机接收到一个新的短信时,这一过程主要由底层硬件完成。一旦接收到短信,底层系统会通过Intent的方式通知上层应用程序。这些Intent都在`android.provider.Telephony.Intents`类中定义。对于上层应用来说,关键在于处理`SMS_RECEIVED_ACTION`广播事件,这是由Frameworks发出的,用于告知上层系统有一条新的SMS已经到达。
在MMS中,`PrivilegedSmsReceiver`是处理`SMS_RECEIVED_ACTION`的组件。当收到该广播事件后,`PrivilegedSmsReceiver`会启动`SmsReceiverService`来处理具体事务。对于Class0类型的短信,它们通常不存储在数据库中,而是在GUI(图形用户界面)直接显示。对于其他类型的短信,系统会检查数据库中是否已有相同原始地址和协议标识的消息。如果找到,旧消息会被新消息替换;如果没有找到,则新消息会被插入数据库。
替换或插入短信的过程涉及多个步骤。根据新短信创建一个`ContentValues`对象,然后使用短信的地址和协议标识作为条件查询数据库。如果查询结果存在,就用新短信替换旧记录;否则,将新短信存储到数据库。存储前,系统会同步短信地址与联系人数据库,确保地址可识别。如果线程ID无效,系统会尝试用同步后的地址重新生成线程ID,最多尝试5次。将更新后的线程ID和`ContentValues`插入数据库。如果设置将短信保存到SIM卡,还会调用`SmsManager`将信息复制到SIM卡上。接着,计算短信大小并更新数据库,删除过期和超出数量限制的短信,返回插入后的短信URI,并使用该URI在状态栏创建通知。此外,由于短信已存储到数据库,GUI在刷新列表时也会自动显示新短信。
彩信的接收则有所不同。彩信通常是通过MMSC(Multimedia Messaging Service Center)服务来接收的。当彩信到达时,Telephony Frameworks会发送一个包含`android.provider.Telephony.Intents.WAP_PUSH_RECEIVED_ACTION`的Intent,通知上层应用。Intent的数据字段包含了彩信的一些信息,如发送者的手机号码、彩信的URL等。在MMS应用中,`PushReceiver.java`负责处理`WAP_PUSH_RECEIVED_ACTION`。它解析数据字段,生成`NotificationInd`对象并将其存入数据库。接着,`TransactionService`启动并处理`NOTIFICATION_TRANSACTION`,同时接收`NotificationInd`的URI。`TransactionService`会进一步处理彩信的下载和显示,通常涉及HTTP请求来获取彩信内容。
Android MMS的接收流程涉及了多个组件的协同工作,包括底层硬件、Frameworks、广播接收器和服务。短信和彩信的处理方式各有特点,但都确保了用户能够及时、准确地接收到多媒体信息。