• sms接收流程(Java app)


    新信息到达framework后,由SMSDispatcher.java通过广播的形式将其发送给app处理

    1. PrivilegedSmsReceiver.java
     这是一个Receiver,继承自SmsReceiver,可以接收广播:android.provider.Telephony.SMS_RECEIVED, android.provider.Telephony.WAP_PUSH_RECEIVED
     它的onReceive()方法中直接调用了SmsReceiver.onReceiveWithPrivilege()来进行处理

    2. SmsReceiver.java
     通过方法onReceiveWithPrivilege()处理,其会启动SmsReceiverService服务
     
     intent.setClass(context, SmsReceiverService.class);
     intent.putExtra("result", getResultCode());
     beginStartingService(context, intent);
      
      context.startService(intent);

    3. SmsReceiverService.java
     内部用一个Handler来处理各种消息,如:MESSAGE_SENT_ACTIOIN,SMS_RECIEVED_ACTION, ACTION_SEND_MESSAGE;其中,SMS_RECEIVED_ACTION消息对应接收到新信息,调用handleSmsReced(intent,  error)进行处理。
     
      A.SmsMessage[] msgs = Intent.getMessageFromIntent(intent);
      // 从intent中提取出相关字段,这个intent对象是Framework在发送广播的时候生成的,数据包含
      // pdus -- 原始的PDUs信息
      // format --
      // phone_id --
      这里最终会从puds中解析出SmsMessage对象
      B.Uri messageUri = insertMessage(this, msgs, error, format, phoneId);
      // 三步:
       判断是否为 CLASS_0 类型,这种类型的sms直接显示,不做存储;
       判断是否为 replace short message;
       直接将新信息插入数据库;
       
       (对于非 CLASS_0 类型的短信,会进行两种处理,替换现有的消息,或是当作新消息插入。
       原则就是如果在数据库中已有的短信中,与新来的短信的原始地址和协议标识都一样,那么就把其替换成新进的短信,否则就当作新短信插入。)
       
       replaceMessage(Context context, SmsMessage[] msgs, int error, int phoneId);
       具体的替换流程:先用新进的短信生成一个ContentValues,再用短信的地址和协议标识当作条件到数据库中去查询,如果查到了,就替换,否则就存储。
       
       storeMessage(Context context, SmsMessage[] msgs, int error, int phoneId);
       先生成一个CotentValues,然后取出短信的Thread Id和地址,地址要与联系人数据库同步一下,以保证是能识别的地址。如果Thread Id不是合法的,那么就用同步过的地址尝试重新生成Thread Id,尝试5次。然后把刷新过的Thread Id放到ContentValues中,把ContentValues插入到数据库中。如果设置为把信息存储到SIM卡,还要调用SmsManager把信息拷贝到SIM卡上。计算短信的大小,并更新至数据库。删除过期的短信,和超过数量限制的短信,然后返回插入后得到的短信Uri。
       
     C.MessageNotification.blockingUpdateNewMessageIndicator(this, true, false);
     // 这里利用一个类管理Notification信息,
     class MmsSmsNotificationInfo {
      Intent mClickIntent, String mDescription, int mIconResourceId, CharSequence mTicker, long mTimeMillis, String mTitle, int count
     }
     当调用到这里时,会去查询数据库中没有读取的信息,根据读取的相关数据生成一个MmsSmsNotificationInfo对象,并将其加入到一个set中,最后利用这个set中的第一个元素进行notify,显示新信息在notification上

  • 相关阅读:
    使用牛顿迭代法和二分法求解一个数的平方根(python语言实现)
    厄拉多塞筛法和普通方法求素数表(python实现)
    使用辗转相除法求两个数的最大公因数(python实现)
    我在博客园第一篇博文
    Linux安装maven
    MyBatis基础入门
    Maven的使用入门
    nginx的简单使用和使用nginx在windows上搭建tomcat集群
    后端程序员如何玩转AJAX
    Servlet3.0文件上传
  • 原文地址:https://www.cnblogs.com/caidi/p/2939713.html
Copyright © 2020-2023  润新知