Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信。

        <receiver android:name=".smsReceiver" >              <intent-filter>                   <action android:name="android.provider.Telephony.SMS_RECEIVED" />              </intent-filter>          </receiver>

还可以为intent-filter加上一个优先级:

<intent-filter android:priority="100"> 

这样,由于优先级较高,应用将先于系统接收到android.provider.Telephony.SMS_RECEIVED消息。

Java文件:

package com.hzhi.smsReceiver;import java.text.SimpleDateFormat;import java.util.Date;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;public class smsReceiver extends BroadcastReceiver {      @Override      public void onReceive(Context context, Intent intent) {            // 短信内容     StringBuilder strBody = new StringBuilder();         // 短信时间      String strTime = new String();          // 短信发件人     StringBuilder number = new StringBuilder();     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");       Bundle bundle = intent.getExtras();       if (bundle != null) {           Object[] _pdus = (Object[]) bundle.get("pdus");           SmsMessage[] message = new SmsMessage[_pdus.length];           for (int i = 0; i < _pdus.length; i++) {               message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);           }           for (SmsMessage currentMessage : message) {               strBody.append(currentMessage.getDisplayMessageBody());               number.append(currentMessage.getDisplayOriginatingAddress());               strTime = formatter.format(new Date(currentMessage.getTimestampMillis()));         }         String smsBody = strBody.toString();           String smsNumber = number.toString();           Log.v("NUMBER=", smsNumber);         Log.v("TIME=", strTime);           Log.v("BODY=", smsBody);           // 取消消息         this.abortBroadcast();        }     }      }

接收到消息后,通过Intent.getExtras()方法获得Intent的Extras(Bundle变量),再使用Bundle.get("pdus")得到短信数组。为什么是短信数组呢?这是因为有些短信内容比较长,所以需要一个数组来存储。对数组中的每一个元素,再分别取出短信内容、短信来源号码、短信时间。其中,这些元素的短信来源号码和短信时间都是一样的,短信内容不一样,需要拼接起来,构成一条完整的短信的内容。

最后,this.abortBroadcast()取消android.provider.Telephony.SMS_RECEIVED消息。如果为intent-filter设置了较高的优先级,应用先于系统接收到android.provider.Telephony.SMS_RECEIVED消息,然后再将该消息丢弃,这样,系统就不会收到android.provider.Telephony.SMS_RECEIVED消息,也不会发出短信的提示音、震动等。如果没有设置优先级,系统将首先收到android.provider.Telephony.SMS_RECEIVED消息,发出短信的提示音、震动等,然后应用再收到短信。

更多相关文章

  1. android消息机制
  2. android 中管理短信
  3. 浅析Android手机卫士接收短信指令执行相应操作
  4. android的消息处理机制(图+源码分析)——Looper,Handler,Message
  5. android消息处理机制学习(一)-Handler,Message,MessageQueue,Loope
  6. 向Android模拟器发短信打电话
  7. android获取短信所有内容
  8. android广播监听短信并显示内容
  9. Android 短信发送器

随机推荐

  1. Android开发:还是Menu
  2. Ubuntu16.04配置ADB调试环境
  3. Android使用okhttp框架实现带参数Get和Po
  4. 如何在android上打印dom树,render树,displa
  5. only the original thread that created
  6. Delphi for Android(安卓)(aka Delphi XE
  7. 如何直接使用Android(安卓)internal and
  8. android强制横屏息屏后重新打开时会先显
  9. android 详细解答json解析与生成 JSONObj
  10. android超多开发资源整理