原理:
1. 收到短信的时候,会启动短信的广播,短信广播里面包含短信的号码和内容,拿到短信的广播,检测短信里面包含的内容是不是黑名单的内容,本质就是广播接收者.
2. 系统发送短信广播的时候,是怎么存的就怎么样取出来,如果短信过长,那么会拆分成多条短信发送,那么发送的短信广播中会有多条短信。
3.android4.0 以后,广播接收者所在的进程从来没有被启动过,那么广播接收者是不会生效的,即使广播接收者所在的进程被关闭,还是会生效(仅限系统关闭,如果被用户或者因为内存原因是不会被启动,手动关闭是指在应用管理器里面 for stop 来关闭).android4.0 之前,如果是系统关闭广播接收者所在进程,当系统发出的广播中的 action 跟该广播接收者的 action 匹配的时候,系统会启动该广播接收者所在的进程,并把广播发给该广播接收者所在的进程,但是如果用户手动关闭该进程,该进程进入冻结状态再也不会被启动,直到用户下一次手动启动该进程。
关键代码:
(1)Object[] pdus = (Object[])intent.getExtras().get("pdus"); 获得短信数据
(2)byte[] pdu = (byte[])pdus[0];
(3)SmsMessage message = SmsMessage.createFromPdu(pdu); 将字节数组封装为 SmsMessage
(4)String content = message.getMessageBody(); 获得短信内容
(5)String date = new Date(message.getTimestampMillis()).toLocaleString(); 获得短信时间
(6)String senderNumber = message.getOriginatingAddress(); 获得发送方号码
(7)abortBroadcast(); // 阻止其他的广播接收者收到广播,广播终止
权限配置:
清单文件配置:
- //设置优先级
短信防火墙代码:
smsReceiver.java
- package com.ldw.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 {@Overridepublic void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub//拿到短信的信息//短信的内容封装在intent中Bundle bundle = intent.getExtras();//以pdus为键去除一个object数组,数组中的每一个元素,都是一个短信Object[] objects = (Object[]) bundle.get("pdus");//获取广播中的短信内容for(Object object : objects){//通过pdu构造短信SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);if(sms.getOriginatingAddress().equals("21312")){//阻止其他的广播接收者收到广播,广播终止abortBroadcast(); //发送一条默认的信息SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "再见", null, null);}System.out.println(sms.getOriginatingAddress());System.out.println(sms.getMessageBody());}}}
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: