2.2彩信收发
2.2.1模块构成图
模块说明:
- android.telephony:提供一系列获得当前设备telephony服务状态的方法。(sim卡状态,网络类型等)。
- com.android.internal.telephony:接收RIL传入的PUSH通知,处理后广播到APP层。
- android.net:管理网络链接。
- android.net.http:提供android的http服务。
- com.android.mms.transaction:彩信收发的逻辑处理,对发送和接收的不同状态进行处理,支持切换卡槽。
- com.android.mms.data:管理当前当前编辑短信的相关信息(使用的sub、短彩信、附件类型等)。
- com.android.mms.ui:提供短信的UI处理类。
2.2.2数据流
方案说明:
1.接收彩信时需要在framework广播的intent中加入subId,MMS APP在接收到广播之后把subId取出,如果当前数据通道所在卡槽不是接收到PUSH通知的卡槽,则进行切换卡槽操作,切换完成后启动相应的transaction下载彩信。
2.发送彩信时需要判断当前是否支持双卡模式,并能取得当前用户默认选择的卡槽(插入两张卡时能够选择,插入一张卡时默认使用插入的卡),点击发送后把用户选择的卡槽保存。如果用户选择的卡槽与当前卡槽不一致,进行切卡操作,切换完成后启动transaction发送彩信。
3.手动下载彩信时取出的subId与当前使用的卡不一致也需要进行切卡的操作。
2.2.3发送彩信时序图
发送彩信处理概要:
1.用户点击发送以后,取得当前默认的发送卡槽,使用setWorkingMessageSub()将subId设置到workingMessage。
2.调用sendMmsWorker发送彩信,MmsMessageSender新增成员变量mSubscription,初始化时传入subId。
3.如果用户选择的subId与当前数据通道所在的卡槽不同,则进行切换卡槽操作,在MmsMessageSender启动Service类SelectMmsSubscription。在该类中增加切换卡槽的异步SwitchSubscriptionTask,framework提供设置卡槽的方法,传入subId后可将数据通道切换到此sub上。
4.切换成功后,启动TransactionService发送彩信,最终进入SendTransaction调用HttpUtils.httpConnection()通过http协议发送彩信。
2.2.4接收彩信时序图
接收彩信处理概要:
1.framwork接收到PUSH通知后,向APP广播action为WAP_PUSH_DELIVER_ACTION的intent,此intent中需携带有接收PUSH通知的subId。
2.PushReceiver接收到广播后,取出data、subId等相关信息,启动SelectMmsSubscription,如果接收的卡与当前卡槽不一致的话,进行卡槽切换。然后启动TransactionService做彩信接收处理,最终进入NotificationTransaction调用HttpUtils.httpConnection()下载彩信。