38.android广播-短信防火墙

原理:

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;
    }
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值