标签:
上面讲了很多关于广播的很多基础概念,那么BroadcastReceiver在实际的应用中到底会起到样的作用呢?
因为广播是一个系统级别的监听器,所以它可以将不同进程间通信的一个“纽带”。举个简单的例子,我们知道在我们启动service是如果用startService这种方式启动时,访问者和service之间是不能进行数据的“互动”的,但是有了BroadcastReceiver就一样可以进行互动,方法我大致说一下,在activity端创建一个broadcast,同样在service端也创建一个broadcast,相互监听对方的动作,这样就可以达到进程间通信的目的了。
短信拦截
BroadcastReceiver还可以监听系统进程,比如android的收短信,电量低,电量改变,系统启动,等……只要BroadcastReceiver监听了这些进程,就可以实现很多有趣的功能,比如,接收短信的这条广播是一条有序广播,所以我们可以监听这条信号,在传递给真真的接收程序时,我们将自定义的广播接收程序的优先级大于它,并且取消广播的传播,这样就可以实现拦截短信的功能了。
我们只需要一个BroadcastReceiver类,就可以实现这个功能,不需要activity,也不需要布局文件。当然如果需要更加的商业化,需要改进的地方
还有很多。比如我们可以做一个界面让用户从联系人中指定一个号码进行短信拦截,也可以自定义。
package wuchen.broadcastReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
public class SmsReceiver extends BroadcastReceiver
{
// 当接收到短信时被触发
@Override
public void onReceive(Context context, Intent intent)
{
// 如果是接收到短信
if (intent.getAction().equals(
"android.provider.Telephony.SMS_RECEIVED"))
{
// 取消广播(这行代码将会让系统收不到短信)
abortBroadcast();
StringBuilder sb = new StringBuilder();
// 接收由SMS传过来的数据
Bundle bundle = intent.getExtras();
// 判断是否有数据
if (bundle != null)
{
// 通过pdus可以获得接收到的所有短信消息
Object[] pdus = (Object[]) bundle.get("pdus");
// 构建短信对象array,并依据收到的对象长度来创建array的大小
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
{
messages[i] = SmsMessage
.createFromPdu((byte[]) pdus[i]);
}
// 将送来的短信合并自定义信息于StringBuilder当中
for (SmsMessage message : messages)
{
sb.append("短信来源:");
// 获得接收短信的电话号码
sb.append(message.getDisplayOriginatingAddress());
sb.append("\n------短信内容------\n");
// 获得短信的内容
sb.append(message.getDisplayMessageBody());
}
}
Toast.makeText(context, sb.toString()
, 5000).show();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="wuchen.broadcastReceiver"
4 android:versionCode="1"
5 android:versionName="1.0">
6 <application android:icon="@drawable/icon" android:label="@string/app_name">
7 <receiver android:name=".SmsReceiver">
8 <intent-filter android:priority="800">
9 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
10 </intent-filter>
11 </receiver>
12 </application>
13 <!-- 授予程序接收短信的权限 -->
14 <uses-permission android:name="android.permission.RECEIVE_SMS"/>
15 </manifest>
Android——BroadcastReceiver 广播 短信拦截
标签:
原文地址:http://www.cnblogs.com/chenxibobo/p/5354008.html