android的彩信接收应用层部分从PushReceiver开始。当onReceive被调用后,让屏幕亮5秒,然后创建一个ReceivePushTask并使用它的execute方法。ReceivePushTask是一个AsyncTask,实现了doInBackground方法。当传入intent后,会在doInBackground中将其中的数据转成GenericPdu,并根据其消息类型做出不同的操作。
如果是发送报告或已读报告,将其存入数据库。如果是彩信通知,若已存在,则不处理。否则将其存入数据库。启动TransactionService进行处理。
TransactionService中的处理主要是调用mServiceHandler,大体过程与发送彩信时相同,只是此处创建的是NotificationTransaction。
如果不支持自动 下载或数据传输没打开,仅通知mmsc。否则,下载相应彩信,删除彩信通知,通知mmsc,删除超过容量限制的彩信,通知TransactionService处理其余待发送的彩信。
下载彩信的具体操作在framework中。downloadManager.markState(mUri, DownloadManager.STATE_DOWNLOADING, mPhoneId);(多卡操作的情况)中的NotificationInd nInd = (NotificationInd) PduPersister.getPduPersister(mContext).load(uri); 是前期的调用,具体调用transaction中的
protected byte[] getPdu(String url) throws IOException {
ensureRouteToHost(url, mTransactionSettings);
return HttpUtils.httpConnection(
mContext, SendingProgressTokenManager.NO_TOKEN,
url, null, HttpUtils.HTTP_GET_METHOD,
mTransactionSettings.isProxySet(),
mTransactionSettings.getProxyAddress(),
mTransactionSettings.getProxyPort());
},实际是通过http的协议来完成。
关于framework的操作目前还没有跟踪,有待以后继续学习。