短信的接收流程应用层
1、源文件
这部分代码在packages/apps/Mms下,涉及的主要类:
com.android.mms.transaction.PrivilegedSmsReceiver
com.android.mms.transaction.SmsReceiver
com.android.mms.transaction.SmsReceiverService
com.android.mms.transaction.MessagingNotification
2、图解
短信接收的时序图:
![](https://img-my.csdn.net/uploads/201207/13/1342168172_9821.jpg)
注意:SeviceHandler是SmsReceiverService的内部类,SmsReceiver是PrivlegedSmsReceiver的父类;
3、详细分析
3.1 PrivilegedSmsReceiver到SmsReceiverService
1)
PrivilegedSmsReceiver这个接收器从中间才能获取数据
PrivilegedSmsReceiver是一个广播接收器并且继承自SmsReceiver,在AndroidManifest.xml 中有如下声明:
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
android.provider.Telephony.SMS_RECEIVED该action在那被使用到了?如果大家有看过分析中间层的接收流程的童鞋就很清楚了,中间层处理接收到的短信的时侯最后会调用到SMSDispatcher的protected void dispatchPdus(byte[][] pdus) 方法,让我们回眸一下:
protected void dispatchPdus(byte[][] pdus) {
Intent intent = new Intent(Intents.SMS_RECEIVED_ACTION);
intent.putExtra("pdus", pdus);
intent.putExtra("encoding", getEncoding());
intent.putExtra("sub_id", mPhone.getSubscription()); //Subscription information to be passed in an intent
dispatch(intent, "android.permission.RECEIVE_SMS");
}
大家肯定会问dispatch又干了些什么了?
请看下面:
void dispatch(Intent intent, String permission) {
mWakeLock.acquire(WAKE_LOCK_TIMEOUT);
mContext.sendOrderedBroadcast(intent, permission, mResultReceiver,
this, Activity.RESULT_OK, null, null);
}
看到这就不用我多说了吧,很显然是发送了一个叫做Intents.SMS_RECEIVED_ACTION的广播,那又有人刨根问底儿了,上面两个值一样吗?请看intent中对该变量的定义:
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String SMS_RECEIVED_ACTION =
"android.provider.Telephony.SMS_RECEIVED";
到这大家应该明白PrivilegedSmsReceiver会接收到中间层的广播,并且该广播很不一般它承载了短信的内容,它从中间层接过接力棒继续向上传递。
2)
PrivilegedSmsReceiver传递数据
PrivilegedSmsReceiver从中间层获取到短信的数据后会调用onReceiveWithPrivilege()方法,该方法定义在它的父类SmsReceiver中。该方法没有做太多的操作,仅仅是传递消息,一下是其核心代码:
protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) {
if (!privileged && (intent.getAction().equals(Intents.SMS_RECEIVED_ACTION)
|| intent.getAction().equals(Intents.SMS_CB_RECEIVED_ACTION))) {
return;
}
intent.setClass(context, SmsReceiverService.class);
intent.putExtra("result", getResultCode());
beginStartingService(context, intent);
}
它将处理短信的任务交到SmsReceiverService的手中,SmsReceiverService才是真正干活的家伙。
3)SmsReceiverService处理
SmsReceiverService它是一个服务,当它开启的时候:首先是在onCreate中初始化