原理:
1.收到短信的时候,会启动短信的广播,短信广播里面包含短信的号码和内容,拿到短信的广播,检测短信里面包含的内容是不是黑名单的内容,本质就是广播接收者.
2.系统发送短信广播的时候,是怎么存的就怎么样取出来,如果短信过长,那么会拆分成多条短信发送,那么发送的短信广播中会有多条短信。
3.android4.0以后,广播接收者所在的进程从来没有被启动过(比如先给入口创建一个图标再点开,就是i启动,然后再删除图标重新编译,没有图标,相当于更新apk,这个时候广播才会生效),那么广播接收者是不会生效的,当广播接收者生效以后,即使广播接收者所在的进程被关闭,还是会生效(仅限系统关闭,如果被用户或者因为内存原因是不会被启动,手动关闭是指在应用管理器里面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(); //阻止其他的广播接收者收到广播,广播终止
权限配置:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
清单文件配置:
<receiver android:mame="com.ldw.smslanjie.smsReceiver">
<intent-filter android:priority="1000"> //设置优先级
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
短信防火墙代码:
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 {
@Override
public 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());
}
}
}
ActivityMain.java
package com.ldw.smslanjie;
import android.R;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}