Mms短信接收流程分析(一)

在Mms源码AndroidMenifest中与sms接收相关的receiver:PrivilegedSmsReceiver和SmsReceiver,前者继承后者,接收广播后调用后者的onReceiveWithPrivilege()方法处理,而主要不同是申明了android.permission.BROADCAST_SMS,用来阻止SMS spoofing//关于SMS spoofing资料待查。

PrivilegedSmsReceiver接收android.provider.Telephony.SMS_RECEIVED。在SMSDispatcher,Handle中处理case:EVENT_NEW_SMS,其中函数dispatchMessage调用dispatchPdus发出OrderedBroadcast:SMS_RECEIVED,同时请求了一个足以让receiver去取得自己wake lock的wake lock,这里要说一下,在SmsMessage.createFromPdu()方法已经分析了message是cdma还是gsm,因此调用相应类的dispatchMessage函数。

回来继续分析PrivilegedSmsReceiver,接收到广播后,调用父类的onReceiveWithPrivilege()方法,并传递参数privileged=true,这里就进行了判断,对于没有permission的信息,直接ignore。

启动SmsReceiverService之前,用mStartingServiceSync同步请求了一个wake lock,在SmsReceiverService的handleMessage中release the wake lock.

关于SmsReceiverService,下面引一段前人的笔记:
.transaction.SmsReceiverService ,它被创建时首先 初始化了新的工作线程(HandlerThread对象)用来在后台完成相关动作,紧接着在onStartCommand方法里会将具体的任务通过消息(即调用service的Intent)发送给工作线程进行处理。根据 Intent.Action的名称,工作线程会处理4中情况:
A.系统启动完成后BOOT_COMPLETED:把发件箱(outbox)中的消息移动到发送队列(QueuedBox),然后开始发送队列中的消息,最后调用updateNewMessageIndicator方法更新状态栏消息指示图标;
B.处理Sms接收handleSmsReceived:从Intent中取得消息对象,直接显示给用户(Class0类型)或者保持到数据库中。
C.处理Sms发送handleSmsSent:从待发送消息队列中取得消息,并按次序逐个发送;
D.处理通讯网络状态改变handleServiceStateChanged:用户从无信号状态进入有信息号状态后,继续执行发送任务的情况。

handleSmsReceived调用insertMessage方法,其中:
1、sms.getProtocolIdentifier()=0x40,直接返回null,不做任何处理。
2、sms.getMessageClass() = CLASS_0,直接显示信息
3、sms.isReplace()=true,替换原来数据库里面的短信
4、如果以上情况都不是,直接保存到uri:content://sms/inbox

调用MessagingNotification.blockingUpdateNewMessageIndicator()用Notification或者toast的方式提醒用户接收到新信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值