标签:
系统收到短信是有广播的,广播中包含了短信的号码和内容
###短信防火墙
* 系统发送短信广播时,是怎么把短信内容存入广播的,我们就只能怎么取出来
* 如果短信过长,那么发送时会拆分成多条短信发送,那么短信广播中就会包含多条短信
* 4.0之后,广播接收者所在进程如果从来没启动过,那么广播接收者不会生效
* 4.0之后,如果系统自动关闭广播接收者所在进程,在广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,但是如果是用户手动关闭该进程,
那么该进程会进入冻结状态,再也不会启动了,直到用户下一次手动启动该进程
###广播的分类
#####无序广播
* 所有与广播中的action匹配的广播接收者都可以收到这条广播,并且是没有先后顺序,视为同时收到
#####有序广播
* 所有与广播中的action匹配的广播接收者都可以收到这条广播,但是是有先后顺序的,按照广播接收者的优先级排序
package com.itheima.smslanjie; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsManager; import android.telephony.SmsMessage; public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //拿到短信的信息 //短信内容封装在intent中,广播的数据是用Intent传递的 Bundle bundle = intent.getExtras(); //以pdus为键,取出一个object数组,数组中的每一个元素都是一条短信 Object[] objects = (Object[]) bundle.get("pdus"); //拿到广播中的所有短信 for (Object object : objects) { //通过pdu来构造短信,SmsMessage表示短信对象。 SmsMessage sms = SmsMessage.createFromPdu((byte[])object); if(sms.getOriginatingAddress().equals("138438")){//通过地址拦截 //阻止其他广播接收者收到这条广播,则短信应用就收不到短信了,短信应用也是通过系统发送的广播收到短信的, abortBroadcast(); // SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "你是个好人", null, null); System.out.println(sms.getMessageBody()); System.out.println(sms.getOriginatingAddress()); } // System.out.println(sms.getMessageBody()); } } } /* 清单文件: <receiver android:name="com.itheima.smslanjie.SmsReceiver"> <intent-filter android:priority="1000"> 防火墙优先级高于短信应用则广播接受者优先于短信应用接受短信广播 <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 收到Telephony.SMS_RECEIVED这个广播后调用SmsReceiver的方法 </intent-filter> </receiver> 添加权限 <uses-permission android:name="android.permission.RECEIVE_SMS"/> */
标签:
原文地址:http://www.cnblogs.com/yaowen/p/4947572.html