做了个例题。 这个例题拦截了短信内容。 先来看下功能。
我们先给自己的虚拟机发送一条短信。 内容是 I love you ...
然后看下我们的虚拟机。 收到了短信
注意: 左上角那个Notification没有收到短信的内容, 我们用一个Toast输出了这个短信的信息。 拦截掉了
来看一下代码:
首先这个例子没有Activity。 之后一个 SmsReceiver . 专门接收短信的Receiver
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //如果是系统短信Action... if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { //..不再往下传播 this.abortBroadcast(); StringBuffer sb = new StringBuffer(); Bundle bundle = intent.getExtras(); if(bundle != null) { //通过pdus可以获得接收到的所有短信消息 Object[] pdus = (Object[])bundle.get("pdus"); //构建短信对象数组 SmsMessage[] msgs = new SmsMessage[pdus.length]; for(int i = 0; i < pdus.length; i ++) { msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); } for(SmsMessage msg : msgs) { sb.append("短信来自: " + msg.getDisplayOriginatingAddress()); sb.append("内容: " + msg.getMessageBody()); } Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();} } } }
只有一个重点。
this.abortBroadcast(); 我们让这个广播机制不再传播下去。
这是因为短信收到由系统发出广播。 我们的SmsReceiver收到了这个广播。 因为我们在Manifest中配置了。代码如下
<receiver android:name=".SmsReceiver"> <intent-filter android:priority="800"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
由于这个短信广播是 一个 有序广播 Ordered Broadcast 。
这个有序广播。会先发送给优先级最高的那个Receiver。 而我们的这个SmsReceiver中的优先级为800
<intent-filter android:priority="800">
优先级的大小范围为 -1000 到 1000。 我们这个优先级比收到短信的那个软件优先级高。所以我们的SmsReceiver接收到了。 也不再往下传播了。
打印出来了。。
还有一点。 接收短信需要权限。 在Mainfest中配置
<uses-permission android:name="android.permission.RECEIVE_SMS"/> ..
OK啦。