短信接收--短信的接收流程应用层

短信的接收流程应用层

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、图解

短信接收的时序图:

注意: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中初始化࿰
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值